[英]Precedence of user-defined bool conversion
我有一个围绕着句柄的包装器(表示为int
),无论该句柄本身何时可用,它都应该可用。 但是我也想在条件if
情况下轻松地检查一下。 -1 or <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);
}
这样,我可以轻松地将Foo
传递给具有int
的函数,并且所有检查都可以通过。 但是我担心int转换优先于bool转换。 有没有? 我可以确定的是, if(Foo(...))
/ if(!Foo(...))
/ if(!!Foo(...))
始终进行布尔转换,而直接比较采用int转换所以总是给出Foo(1) != Foo(0)
和Foo(1) != Foo(2)
吗?
标准(C ++ 98)似乎不对bool / int用户定义的转换进行排序。
我可以确定的是,if(Foo(...))/ if(!Foo(...))/ if(!! Foo(...))总是进行布尔转换
是。 operator!
和if语句的条件要求将表达式转换为bool
。 通过int
转换需要用户定义为int
转换,然后是将标准转换为bool
转换。 直接转换为bool
只需要一个用户定义的转换。 一次(后期)转换优先于两次(以前)转换。
而直接比较采用int转换,以便始终给出Foo(1)!= Foo(0)和Foo(1)!= Foo(2)吗?
不会。两种转换的排名均等,这是模棱两可的。 模棱两可的转换会使程序格式错误。
解决方案:定义operator==(const Foo&, const Foo&)
和operator!=(const Foo&, const Foo&)
,或者在比较之前进行显式转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.