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) 在流无错误且已为输入/输出操作就绪时返回 true。尤其是返回 !fail()

此运算符使得以流和返回到流引用的函数为循环条件可行,产生惯用的 C++ 输入循环,例如 while (stream >> value) {...}while (std::getline(stream, string)) {...} 。这种循环只有在输入操作成功时才会执行循环体。

参数

(无)

返回值

1) 在流无错误时返回在布尔语境求值为 true 的值,否则返回在布尔语境求值为 false 的值。
2) 在流无错误时返回 true,否则返回 false

注解

可以在期待 bool 的语境(例如 if 条件)使用此转换。然而不允许适用于 bool隐式转换(例如到 int)。

C++98 由于安全 bool 问题无法直接提供 operator bool。因此 C++98 在最开始提供了 operator void*,它会在 fail() 返回 true 时返回一个空指针,在其他情况下返回一个非空指针。它被 LWG 问题 468 的解决方案(即重载 (1))替换,以允许使用安全 bool 手法

从 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 是 " << static_cast<bool>(s) << '\n';
    while (s >> n)
        std::cout << n << '\n';
    std::cout << "s 是 " << static_cast<bool>(s) << '\n';
}

输出:

s 是 true
1
2
3
s 是 false

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
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