std::basic_ios<CharT,Traits>::operator bool

從 cppreference.com
< cpp‎ | io‎ | basic ios
 
 
 
 
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