Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载逻辑NOT运算符与布尔类型强制转换运算符_C++_Operator Overloading_Not Operator - Fatal编程技术网

C++ 重载逻辑NOT运算符与布尔类型强制转换运算符

C++ 重载逻辑NOT运算符与布尔类型强制转换运算符,c++,operator-overloading,not-operator,C++,Operator Overloading,Not Operator,考虑以下代码: 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:

考虑以下代码:

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;
}
类真理
{
公众:
真值(bool-val):值(val){}

bool操作符!(){std::cout在C++11中,您可以简单地重载
显式操作符bool()
。没有理由重载
操作符!
,除非您希望它做一些不同的事情-如果您认为需要,您可能应该重新考虑


从历史上看,重载
运算符bool
将打开隐式转换为任何数字类型的大门,这可能会导致混淆、歧义和微妙的错误;因此最好不要这样做。重载
运算符!
是一种简单的方法,可以允许在条件中使用一些内容,如果您不想使用的话,无需打开那扇门et陷入了。(该链接仅用于历史目的;由于显式转换运算符,该习惯用法。)

我知道您要去哪里,但在
if(t)时调用
运算符也会让人困惑!
没有!@chris,完全同意,这就是我猜测重载
操作符的原因!
应该被劝阻。你说呢?我不能说我能从头脑中想出任何有用的简单重载。我相信你可以在Boost中找到各种不简单的重载,但每个操作符都是一样的。