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