Horstmann’s C++ pitfalls在討論流時解決了一個有趣的問題。要引用他的話:使用void *而不是bool是一個可取的做法嗎?
使用轉換
void*
,不能轉化爲int
或bool
,實現高產真值的對象。不同於int
或bool
,void*
除==
以外沒有其他合法的操作比較。
作爲一名程序員,如果某個函數返回void*
,那麼我會感到困惑。 Horstmann提供了一個例子,其中使用void*
而不是bool
似乎合適。它總是可取的嗎?
Horstmann’s C++ pitfalls在討論流時解決了一個有趣的問題。要引用他的話:使用void *而不是bool是一個可取的做法嗎?
使用轉換
void*
,不能轉化爲int
或bool
,實現高產真值的對象。不同於int
或bool
,void*
除==
以外沒有其他合法的操作比較。
作爲一名程序員,如果某個函數返回void*
,那麼我會感到困惑。 Horstmann提供了一個例子,其中使用void*
而不是bool
似乎合適。它總是可取的嗎?
在一般情況下不建議這樣做,並且根本不建議使用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
。
希望這會有所幫助!
晶瑩剔透,謝謝 – qdii 2012-02-03 20:21:25
在C++ 11中,「istream」的定義是否改變爲使用這個新特性? – 2012-02-03 20:27:50
@Kerrek:是的。這是[突破性變化](http://stackoverflow.com/questions/6399615/what-breaking-changes-are-introduced-in-c11),但只有打破破碎的代碼('刪除std :: cin'獲勝不再編譯)。 – 2012-02-03 20:28:52
建議什麼時候是個好主意,如果不是好主意,這是不明智的。你期望什麼樣的答案? – 2012-02-03 20:15:34
@KerrekSB:案例,爲了能夠區分好的做法和不好的做法,我現在有點困惑。我們爲什麼不一直這樣做?爲什麼我們不只是'typedef void * secure_bool' – qdii 2012-02-03 20:17:16
相關: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