2012-02-03 33 views
3

Horstmann’s C++ pitfalls在討論流時解決了一個有趣的問題。要引用他的話:使用void *而不是bool是一個可取的做法嗎?

使用轉換void*,不能轉化爲intbool,實現高產真值的對象。不同於intbool,void*==以外沒有其他合法的操作比較。

作爲一名程序員,如果某個函數返回void*,那麼我會感到困惑。 Horstmann提供了一個例子,其中使用void*而不是bool似乎合適。它總是可取的嗎?

+1

建議什麼時候是個好主意,如果不是好主意,這是不明智的。你期望什麼樣的答案? – 2012-02-03 20:15:34

+0

@KerrekSB:案例,爲了能夠區分好的做法和不好的做法,我現在有點困惑。我們爲什麼不一直這樣做?爲什麼我們不只是'typedef void * secure_bool' – qdii 2012-02-03 20:17:16

+2

相關:http://stackoverflow.com/questions/6242296/conversion-function-for-error-checking-considered-good和http://stackoverflow.com/questions/8809224/how-do-this-conversion-to-bool-work和http://stackoverflow.com/q/6242768/500104(以及示例:http://www.artima.com/cppsource/safebool。 HTML,也鏈接) – 2012-02-03 20:17:22

回答

10

在一般情況下不建議這樣做,並且根本不建議使用C++ 11。

的原因轉換爲void*是支持類似語法

std::ifstream myStream; 
if (myStream) { 

} 
if (!myStream) { 

} 

這裏,轉換到bool似乎更合理,但會造成weirdnesses這樣的:

if (myStream == true) // ?? 

的轉換void*防止此代碼合法,但打開了整個其他的蠕蟲,如

delete myStream; // ?? 

在C++ 11中,具有將explicit operator bool()作爲成員函數的功能,此黑客已被棄用且不應使用。不要使用這個成語。如果您需要返回bool,請返回bool。如果您需要可以轉換爲bool的對象,請使用explicit operator bool

希望這會有所幫助!

+0

晶瑩剔透,謝謝 – qdii 2012-02-03 20:21:25

+0

在C++ 11中,「istream」的定義是否改變爲使用這個新特性? – 2012-02-03 20:27:50

+2

@Kerrek:是的。這是[突破性變化](http://stackoverflow.com/questions/6399615/what-breaking-changes-are-introduced-in-c11),但只有打破破碎的代碼('刪除std :: cin'獲勝不再編譯)。 – 2012-02-03 20:28:52

相關問題