簡體   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