我有一个句柄周围的包装器(表示为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(...))
总是进行bool转换,而直接比较则采用int转换,以便Foo(1) != Foo(0)
和Foo(1) != Foo(2)
始终给定?
标准(C ++ 98)似乎没有对bool / int用户定义的转换下订单。
答案 0 :(得分:2)
我可以肯定,如果(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&)
,或在比较前明确投射。