std::basic_ios<CharT,Traits>::operator bool
来自 cppreference.cn
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 issue 468 的解决方案取代,该解决方案允许应用 安全布尔习语。
自 C++11 起,转换函数可以是 explicit。 LWG 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++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
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 |