Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ 用户定义布尔转换的优先级_C++_Operator Overloading_Implicit Conversion - Fatal编程技术网

C++ 用户定义布尔转换的优先级

C++ 用户定义布尔转换的优先级,c++,operator-overloading,implicit-conversion,C++,Operator Overloading,Implicit Conversion,我在句柄周围有一个包装器(表示为int),它应该可以在句柄本身可用的任何地方使用。但我还想在if条件中轻松检查这一点-1或=0;} }; int main(){ fooa(0); 如果(a) ; 其他的 断言(假); 如果(!a) 断言(假); 断言(!!a); 富b(1),; 断言(!!b); 断言(b); 断言(a!=b); fooc(-1); food(-1); 断言(!c); 断言(c==d); fooe(-2); 断言(c!=e); } 通过这种方式,我可以轻松地将Foo传递给接受i

我在句柄周围有一个包装器(表示为
int
),它应该可以在句柄本身可用的任何地方使用。但我还想在
if
条件中轻松检查这一点<代码>-1或=0;} }; int main(){ fooa(0); 如果(a) ; 其他的 断言(假); 如果(!a) 断言(假); 断言(!!a); 富b(1),; 断言(!!b); 断言(b); 断言(a!=b); fooc(-1); food(-1); 断言(!c); 断言(c==d); fooe(-2); 断言(c!=e); } 通过这种方式,我可以轻松地将
Foo
传递给接受
int
的函数,并且所有检查都通过。然而,我担心int转换比bool转换的优先级。有吗?我可以肯定的是,
if(Foo(…)
/
if(!Foo(…)
/
if(!!Foo(…))
总是采用bool转换,而直接比较采用int转换,因此
Foo(1)!=Foo(0)
Foo(1)!=Foo(2)
是否总是给出

标准(C++98)似乎没有对bool/int用户定义的转换下命令

我可以确定,if(Foo(…)/if(!Foo(…)/if(!!Foo(…))总是进行bool转换吗

对<代码>操作员和if语句的条件要求将表达式转换为
bool
。通过
int
转换需要用户定义到
int
的转换,然后是到
bool
的标准转换。直接转换为
bool
只需要一次用户定义的转换。一个(后一个)转换优先于两个(前一个)

而直接比较采用整数转换,因此Foo(1)!=富(0)和富(1)!=总是给出Foo(2)

否。两种转换的排名相同,其目的不明确。模棱两可的转换使程序格式不正确


解决方案:定义
运算符==(const Foo&,const Foo&)
运算符=(const-Foo&,const-Foo&)
,或在比较之前显式强制转换。

是否必须使用C++98?C++11及其后提供了
显式
转换
运算符
s,为此,确保正确转换为
bool
是一个主要原理-确保我们不会使用其他转换为另一种类型的转换,而这种转换本身可以转换为
bool
,当用于决策时,可能会产生非常错误的结果。如果你必须使用旧的C++,那么研究“安全BooL”习惯用法。是的,我需要使用C++ 98。我不认为safe-bool习惯用法在这里有帮助,因为我仍然有int转换,可能会被选中进行比较。好吧,这是有效的。注意,g++并没有抱怨歧义,而是抱怨叮当声(3.8)does@Flamefire有趣。我认为在这种情况下,即使不显示警告也不符合标准。使用g++4.8.5。是的,我也会这么想。甚至连
-Wall-Wextra
都没有为g++5.3.0显示任何相同的内容:没有任何警告
#include <cassert>

struct Foo{
    int i;
    Foo(int i): i(i){}
    operator int() const { return i; }
    operator bool() const { return i >= 0; }
};

int main(){
    Foo a(0);
    if(a)
        ;
    else
        assert(false);
    if(!a)
        assert(false);
    assert(!!a);
    Foo b(1);
    assert(!!b);
    assert(b);
    assert(a != b);
    Foo c(-1);
    Foo d(-1);
    assert(!c);
    assert(c==d);
    Foo e(-2);
    assert(c!=e);
}