std::basic_ios<CharT,Traits>:: operator bool
|
operator
/* 未指定布尔类型 */
(
)
const
;
|
(1) | (C++11 前) |
|
explicit
operator
bool
(
)
const
;
|
(2) | (C++11 起) |
检查流是否无错误。
该运算符使得将流及返回流引用的函数用作循环条件成为可能,从而形成了典型的C++输入循环模式,例如 while ( stream >> value ) { ... } 或 while ( std:: getline ( stream, string ) ) { ... } 。此类循环仅在输入操作成功时才会执行循环体。
目录 |
参数
(无)
返回值
注释
此转换可用于需要 bool 类型的上下文(例如 if 条件 )。但 bool 可能发生的 隐式转换 (例如转换为 int )在此不被允许。
在 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++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| 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 |