std::basic_ios<CharT,Traits>::operator bool
出自cppreference.com
operator /* 未指定的布爾類型 */() const; |
(1) | (C++11 前) |
explicit operator bool() const; |
(2) | (C++11 起) |
檢查流是否無錯誤。
1) 在 fail() 返回 true 時返回在布爾語境求值為 false 的值,否則返回在布爾語境求值為 true 的值。
2) 在流無錯誤且已為輸入/輸出操作就緒時返回 true。明確說即返回 !fail()。
此運算符使得以流和返回到流引用的函數為循環條件可行,導致慣用的 C++ 輸入循環,例如 while (stream >> value) {...} 或 while (std::getline(stream, string)) {...}。這種循環只有在輸入操作成功時才會執行循環體。
目錄 |
[編輯] 參數
(無)
[編輯] 返回值
1) 在流無錯誤時返回在布爾語境求值為 true 的值,否則返回在布爾語境求值為 false 的值。
2) 在流無錯誤時返回 true,否則返回 false。
[編輯] 註解
可以在期待 bool 的語境(例如 if 條件)使用此轉換。然而不允許適用於 bool 的隱式轉換(例如到 int)。
C++98 由於安全 bool 問題無法直接提供 operator bool。因此 C++98 在最開始提供了 operator void*,它會在 fail() 返回 true 時返回一個空指針,在其他情況下返回一個非空指針。它被 LWG 問題 468 的解決方案(即重載 (1))替換,以允許使用安全 bool 手法。
從 C++11 開始,轉換函數可以是 explicit 的。LWG 問題 1094 的解決方案引入了顯式的 operator bool,從此可以安全轉換到布爾值。
[編輯] 示例
運行此代碼
#include <iostream> #include <sstream> int main() { std::istringstream s("1 2 3 error"); int n; std::cout << std::boolalpha << "s 是 " << static_cast<bool>(s) << '\n'; while (s >> n) std::cout << n << '\n'; std::cout << "s 是 " << static_cast<bool>(s) << '\n'; }
輸出:
s 是 true 1 2 3 s 是 false
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 出版時的行為 | 正確行為 |
---|---|---|---|
LWG 468 | C++98 | 提供了 operator void* | 改成提供到未指定的布爾類型的轉換函數 |
[編輯] 參閱
下表顯示 basic_ios
訪問器(good()、fail() 等)對於 ios_base::iostate 標誌的所有可能組合的值:
ios_base::iostate 標誌 | basic_ios 訪問器
| |||||||
eofbit
|
failbit
|
badbit
|
good() | fail() | bad() | eof() | operator bool | operator! |
false | false | false | true | false | false | false | true | false |
false | false | true | false | true | true | false | false | true |
false | true | false | false | true | false | false | false | true |
false | true | true | false | true | true | false | false | true |
true | false | false | false | false | false | true | true | false |
true | false | true | false | true | true | true | false | true |
true | true | false | false | true | false | true | false | true |
true | true | true | false | true | true | true | false | true |