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 468C++98提供了 operator void*改成提供到未指定的布尔类型的转换函数

参阅

下表显示 basic_ios 访问器(good()fail() 等)对于 ios_base::iostate 标志的所有可能组合的值:

ios_base::iostate 标志basic_ios 访问器
eofbitfailbitbadbitgood()fail()bad()eof()operator booloperator!
falsefalsefalsetruefalsefalsefalsetruefalse
falsefalsetruefalsetruetruefalsefalsetrue
falsetruefalsefalsetruefalsefalsefalsetrue
falsetruetruefalsetruetruefalsefalsetrue
truefalsefalsefalsefalsefalsetruetruefalse
truefalsetruefalsetruetruetruefalsetrue
truetruefalsefalsetruefalsetruefalsetrue
truetruetruefalsetruetruetruefalsetrue