命名空间
变体
操作

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

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

此运算符使得可以将流和返回流引用的函数用作循环条件,从而产生惯用的 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 的解决方案取代,该解决方案允许应用 Safe Bool 惯用法

自 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++ 标准。

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