命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | io‎ | basic ios
 
 
 
 
operator /* unspecified-boolean-type */() const;
(1) (直到 C++11)
explicit operator bool() const;
(2) (自 C++11 起)

检查流是否没有错误。

1) 如果 fail() 返回 true,则在布尔上下文中返回一个在布尔上下文中计算为 false 的值,否则返回一个在布尔上下文中计算为 true 的值。
2) 如果流没有错误并且已准备好进行 I/O 操作,则返回 true。具体来说,返回 !fail()

此运算符使得能够使用流以及返回对流的引用的函数作为循环条件,从而产生像 while (stream >> value) {...}while (std::getline(stream, string)) {...} 这样的惯用 C++ 输入循环。此类循环仅在输入操作成功时执行循环体。

内容

[编辑] 参数

(无)

[编辑] 返回值

1) 如果流没有错误,则在布尔上下文中返回一个在布尔上下文中计算为 true 的值,否则返回一个在布尔上下文中计算为 false 的值。
2) 如果流没有错误,则返回 true,否则返回 false

[编辑] 说明

此转换可用于需要 bool 的上下文(例如,if 条件)。但是,隐式转换(例如,转换为 int)在 bool 中是不允许的。

在 C++98 中,由于 安全布尔问题,无法直接提供 operator bool。C++98 中的初始解决方案是提供 operator void*,如果 fail() 返回 true 则返回空指针,否则返回非空指针。它被 LWG 问题 468 的解决方案所取代,该解决方案允许应用 安全布尔习语

自 C++11 起,转换函数可以是 explicitLWG 问题 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++ 标准。

DR 应用于 已发布的行为 正确的行为
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