Namespaces
Variants

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

From cppreference.net
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 问题 468 的解决方案取代,该方案允许应用 安全布尔惯用法

自 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 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