繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM