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) 如果流沒有錯誤且已準備好進行 I/O 操作,則返回 true。具體而言,返回 !fail()。
此運算子使得將流和返回流引用的函式用作迴圈條件成為可能,從而產生慣用的 C++ 輸入迴圈,例如 while (stream >> value) {...} 或 while (std::getline(stream, string)) {...}。此類迴圈僅在輸入操作成功時執行迴圈體。
目錄 |
[編輯] 引數
(無)
[編輯] 返回值
1) 如果流沒有錯誤,則返回在布林上下文中求值為 true 的值;否則,返回在布林上下文中求值為 false 的值。
2) 如果流沒有錯誤,則返回 true;否則返回 false。
[編輯] 注意
此轉換可在期望 bool 的上下文中(例如 if 條件)使用。但是,不允許發生與 bool 相關的 隱式轉換(例如轉換為 int)。
在 C++98 中,由於 安全布林問題,不能直接提供 operator bool。C++98 中的初始解決方案是提供 operator void*,如果 fail() 返回 true 則返回空指標,否則返回非空指標。它被 LWG issue 468 的解決方案取代,該解決方案允許應用 安全布林習語。
自 C++11 起,轉換函式可以是 explicit。 LWG issue 1094 的解決方案引入了顯式的 operator bool,並且布林轉換現在是安全的。
[編輯] 示例
執行此程式碼
#include <iostream> #include <sstream> int main() { std::istringstream s("1 2 3 error"); int n; std::cout << std::boolalpha << "s is " << static_cast<bool>(s) << '\n'; while (s >> n) std::cout << n << '\n'; std::cout << "s is " << static_cast<bool>(s) << '\n'; }
輸出
s is true 1 2 3 s is false
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 468 | C++98 | 提供了 operator void* | 改為提供到未指定布林型別的轉換函式 |
[編輯] 另請參閱
下表顯示了在 ios_base::iostate 標誌的所有可能組合下,basic_ios 訪問器(good()、fail() 等)的值
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 |