名稱空間
變體
操作

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) 如果流沒有錯誤且已準備好進行 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 起,轉換函式可以是 explicitLWG 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