std::basic_ios<CharT,Traits>::operator bool
来自 cppreference.cn
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()。
此运算符使得可以将流和返回流引用的函数用作循环条件,从而产生惯用的 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 的解决方案取代,该解决方案允许应用 Safe Bool 惯用法。
自 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++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
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 |