2014-02-25 47 views
0

考慮下面的代碼實現被調用。重載邏輯非運算符VS布爾類型轉換操作符

但是,如果operator!()實現被註釋掉,在所有3個語句中,operator bool()被調用。

我明白這種情況發生的原因,但我擔心的是,重載邏輯NOT運算符(!)似乎錯過了真值評估語義的一半,而bool類型轉換運算符似乎很好地覆蓋了它們。

我是否錯過了某些東西,或者應該讓邏輯NOT運算符的重載變得不受bool類型轉換的支持?

+0

我看到你要去的地方,但是當'if(t )'沒有! – chris

+0

@chris,完全同意,這就是爲什麼我猜測重載'operator!'應該是不鼓勵的。你不會說嗎? – imreal

+0

我不能說我可以想到任何有用的直接超負荷從我的頭頂。我相信你可以在Boost中找到各種*不直接的,但是每個運營商都是這樣。 – chris

回答

2

在C++ 11中,您可以簡單地重載explicit operator bool()。沒有理由超載operator!,除非你想讓它做不同的事 - 如果你認爲你想要的話,你應該再想一想。

從歷史上看,重載operator bool會打開大門,隱式轉換爲任何數字類型,這可能會導致混淆,含糊和細微的錯誤;所以最好不要這樣做。超載operator!是一種允許在條件中使用的簡單方法,無需打開門,如果您不想陷入safe bool idiom。 (這個鏈接僅僅是爲了歷史利益;由於有明確的轉換運算符,所以成語is obsolete in C++11。)