在this answer我談論使用std::ifstream
對象的轉換爲bool
來測試流是否仍處於良好狀態。我查看Josuttis書籍以獲取更多信息(如果您有興趣,請參閱第600頁),結果發現iostream
對象實際上超載operator void*
。它在流不良(它可以隱式轉換爲false
)時返回一個空指針,否則返回一個非空指針(隱式轉換爲true
)。爲什麼他們只是超載operator bool
?爲什麼iostream對象不能重載operator bool?
9
A
回答
7
這是「安全布爾」問題的一個實例。
這是一篇好文章:http://www.artima.com/cppsource/safebool.html。
C++ 0x幫助explicit
轉換函數的情況以及Kristo提到的更改。另見Is the safe-bool idiom obsolete in C++11?。
13
它看起來像C++ 0x標準部分27.4.4.3有答案(強調我的)。
operator unspecified-bool-type() const;
返回:如果
fail()
那麼值 將評估在布爾 上下文假;否則將會在布爾上下文中求值爲 。 返回的價值類型不得爲 可轉換爲int
。注意:此轉化可以在 上下文其中
bool
預計 (例如,如果條件)中使用;然而,隱式轉換(例如,到int
) 可能發生的bool
不允許 允許,從而消除了某些 用戶錯誤的來源。
-1
最新C++ 11要求:
explicit operator bool() const;
見C++ 11 27.5.5.4-1。儘管如此,「顯式」對我來說似乎很奇怪。
+1
'explicit'是它被添加的原因。像這樣的'explicit'轉換函數僅適用於* only *轉換,在這種情況下,它將通過中間'bool'轉換將'iostream'轉換爲'bool',而不是'int'。閱讀本頁面的其他答案,瞭解安全布爾成語。 – Potatoswatter 2012-05-15 06:54:27
相關問題
- 1. 爲什麼重載operator()?
- 2. 重載operator << outputs bool value。爲什麼?
- 3. 爲什麼不能在std :: string上重載「operator <<」?
- 4. 爲什麼operator ==不會超載?
- 5. 如何重載operator >> for bool
- 6. 爲什麼我會重載operator new或operator delete?
- 7. 重載operator =在C++模板(對象)
- 8. 爲什麼不能在另一個對象中加載對象?
- 9. 重載operator-,operator <和operator>
- 10. 爲什麼不能重載RHR功能?
- 11. 爲什麼重載operator <作爲成員函數是不好的做法?
- 12. 你什麼時候重載operator new?
- 13. operator()重載時,'const'做什麼?
- 14. 不能分配或複製iostream對象?
- 15. map operator []和bool作爲值
- 16. 爲什麼iostream哨兵對象在標準中被稱爲「cerberos」?
- 17. bool operator == typedef struct
- 18. 在C++中重載operator new和operator new []有什麼區別?
- 19. 爲什麼當我投到「長」時調用「operator bool()」?
- 20. 爲什麼NSTableView不能重新加載?
- 21. 如何在爲類值對象重載operator +時處理null?
- 22. 重載運算符<< operator ==和operator!=
- 23. 爲C++類重載operator +。
- 24. 重載<operator C++
- 25. 爲什麼iostream包含time.h?
- 26. 爲什麼delphi不能識別對象?
- 27. 爲什麼在使用operator << via template時需要重載?
- 28. 爲什麼「std :: accumulate」需要顯式重載「operator +」?
- 29. operator []重載C++
- 30. 爲什麼對象不能爲PROC對象
此答案已過時。它沒有標準化,因爲增加了顯式的轉換函數。 – Potatoswatter 2013-02-21 14:17:16