为什么iostream对象不会超载operator bool?

Mic*_*fik 9 c++ iostream operator-overloading

这个答案中,我谈到使用std::ifstream对象的转换bool来测试流是否仍处于良好状态.我查看了Josuttis的书以获取更多信息(如果你感兴趣,请查看600页),事实证明这些iostream物体实际上已超载operator void*.当流不好(可以隐式转换为false)时返回空指针,否则返回非空指针(隐式转换为true).他们为什么不过载operator bool

Mic*_*fik 13

看起来像C++ 0x标准部分27.4.4.3有答案(强调我的).

operator unspecified-bool-type() const;
Run Code Online (Sandbox Code Playgroud)

返回:如果fail()那么将在布尔上下文中评估false的值; 否则,将在布尔上下文中评估true的值. 返回的值类型不得转换为int.

注意:此转换可用于bool期望a的上下文中(例如,if条件); 但是,不允许int发生可能发生的隐式转换(例如,to ),从而bool消除了一些用户错误的来源.


Pot*_*ter 7

这是"安全布尔"问题的一个例子.

这是一篇很好的文章:http://www.artima.com/cppsource/safebool.html.

C++ 0x有助于explicit转换函数的情况,以及Kristo提到的更改.另请参阅C++ 11中的safe-bool成语是否过时?.