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);
}