考虑以下代码:
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()
。我理解为什么会发生这种情况,但是我的担忧是,重载逻辑非运算符(!)似乎错过了一半的真值评估语义,而
bool
类型转换运算符则似乎很好地涵盖了这些语义。我是否漏掉了什么或者应该鼓励使用bool类型转换而不是重载逻辑非运算符?
if (t)
没有!
时调用operator!
也会令人困惑。 - chrisoperator!
。你觉得呢? - imreal