std::basic_ios<CharT,Traits>::operator bool
来自cppreference.com
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 |