我已经看到SoF上的评论或答案,说明将强制转换操作符重载到bool是危险的,我宁愿选择void* operator
.我仍然想问一下,在我的用例中使用这个运算符是否危险,如果是,为什么.
我实现了一个简单的几何库,其中一个最基本的类是我用以下方式定义的一个点:
struct point { double x, y; bool real; point(double x_, double y_): x(x_), y(y_), real(true) {} point(): x(0), y(0), real(true) {} operator bool() { return real; } };
我将尝试解释为什么我需要使用强制转换操作符来布尔.我有另一个名为line的类,我有一个声明如下的函数:
point intersect(const line& a, const line& b);
现在已经重载转换运算符为bool点我可以写两者:point p = intersect(a,b);
和if (intersect(a,b))
因此得到任一的两条线的交叉点或检查,如果两条线相交.我也在其他地方使用它,但我相信这个例子足以显示强制转换运算符的用法.我对演员操作员的使用是否危险,如果是,你可以举一个例子,当效果不符合预期时?
编辑:由于juanchopanza的一个小小的补充:在这个项目中我只能使用c ++ 11,所以我无法使运算符显式化.
这还不够好.既然你坚持使用C++ 03,那么如果你需要这样的东西就应该使用safe-bool习语(否则,explicit
首选转换函数).
另一种解决方案是返回boost:optional
:
boost::optional<point> intersect(const line& a, const line& b);
我会采用这种方法(即使在C++ 11中),因为它在语义上看起来更好 - 并行线没有交叉点,因此返回值确实应该是可选的(或者可能是值).