2017-04-19 114 views
0

我有一个模仿整数行为的类。它具有以下重载:C++如何在if(class)中选择使用哪个运算符?

class myInt 
{ 
    ... 
    operator int() const { return val; } 
    operator bool() const { return 0 != val; } 
    operator myInt *() { assert(0); return NULL; } // Cast to pointer not supported 
    ... 
private: 
    int val; 
} 

当我按如下方式使用它:

myInt i = 0; 
if (i) ... 

它击中的指针投断言。

为什么C++选择这个而不是bool操作符里面的if?

干杯,

伊恩

回答

0

通过进一步调查,原来该常量的运营商布尔是问题。

编译器首选非运算符myInt *()给运算符bool()const。

当我加入下列过载:

operator bool() { return 0 != val; } 

代码走进布尔算子代替,如需要的话。

+0

反过来说:在指针转换上缺少** const **是个问题。这些函数都没有修改对象,所以它们都应该标记为“const”。 –

+0

问题是非const转换为指针比const转换为bool更受欢迎,即使它正在将该类型视为布尔值。 –

+0

是的,没错。非const的运算符被应用于非const对象,因为它是一个更好的匹配。如果所有的转换运算符都是不会发生的const。 –