考虑以下代码:
class Truth
{
public:
Truth(bool val) : value(val) {}
bool operator!() {std::cout<<"operator!()"<<std::endl; return !value;}
operator bool() {std::cout<<"operator bool()"<<std::endl; return value;}
private:
bool value;
};
int main()
{
Truth t(true);
if(!t)
std::cout<<"t is false"<<std::endl;
else
std::cout<<"t is true"<<std::endl;
if(!!t)
std::cout<<"t is false"<<std::endl;
else
std::cout<<"t is true"<<std::endl;
if(t)
std::cout<<"t is false"<<std::endl;
else
std::cout<<"t is true"<<std::endl;
return 0;
}
在语句中if(!t)
,if(!!t)
重载的operator!()
实现被调用,而(并不奇怪)在语句if(t)
中,重载的operator bool()
实现被调用。
但是,如果operator!()
实现被注释掉,在所有 3 个语句中,operator bool()
都会被调用。
我理解“为什么”会发生这种情况,但我担心的是,重载逻辑 NOT 运算符(!)似乎错过了一半的真值评估语义,而bool
类型转换运算符似乎很好地覆盖了它们。
我是否遗漏了什么,或者是否应该不鼓励逻辑 NOT 运算符的重载以支持 bool 类型转换?