【发布时间】:2013-12-22 02:40:09
【问题描述】:
我在 SoF 上看到 cmets 或答案指出将强制转换运算符重载为 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);
现在已经将强制转换运算符重载为一个点的布尔值,我可以同时编写:point p = intersect(a,b); 和if (intersect(a,b)),因此要么获取两条线的交点,要么检查两条线是否相交。我也在其他地方使用它,但我相信这个例子足以展示 cast 运算符的用法。我使用演员表操作符有危险吗?如果有,请举例说明什么时候效果不符合预期?
编辑:感谢 juanchopanza 的一个小补充:在这个项目中,我仅限于不使用 c++11,所以我不能明确操作符。
【问题讨论】:
-
如果你有 C++11,你可以通过使转换操作符
explicit来消除危险。 -
@juanchopanza 我知道,但我仅限于 pre-
c++11 -
如果您懒得实现自己的
safe_bool,请参阅此答案以获取 boost 中可用的集合:stackoverflow.com/questions/11781584/safe-bool-idiom-in-boost -
其他人回答了为什么强制转换为 bool 是一个坏主意。我还要说:设计有很大缺陷。您的结构比要求的大 4 字节,它包含一个非规范成员,仅需要一个操作。相反:从 intersect 返回一个可选项,或者实现
bool intersects()谓词。 -
对无意转化的担忧往往被夸大了。你担心什么危险?有人可能会写
int x = intersect(a,b)并认为它实际上做了一些有用的事情?
标签: c++ casting boolean operator-overloading