命名空间
变体
操作

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

来自 cppreference.cn
< 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