用户定义的bool转换的优先级

时间:2016-07-08 14:32:55

标签: c++ operator-overloading implicit-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(...))总是进行bool转换,而直接比较则采用int转换,以便Foo(1) != Foo(0)Foo(1) != Foo(2)始终给定?

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

1 个答案:

答案 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&),或在比较前明确投射。