std::basic_ios<CharT,Traits>::operator bool
来自 cppreference.com
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 起,转换函数可以是 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++ 标准。
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 |