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

时间:2009-08-26 13:54:48

标签: c++ operator-overloading iostream

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

3 个答案:

答案 0 :(得分:13)

看起来C ++ 0x标准第27.4.4.3节有答案(强调我的)。

operator unspecified-bool-type() const;
  

返回:如果fail()则为值   将在布尔值中评估false   上下文;否则是一个值   在布尔上下文中计算true。   返回的值类型不应该是   可转换为int

     

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

答案 1 :(得分:7)

这是“安全布尔”问题的一个例子。

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

C ++ 0x有助于explicit转换函数的情况,以及Kristo提到的更改。另请参阅Is the safe-bool idiom obsolete in C++11?

答案 2 :(得分:-1)

最新的C ++ 11要求:

explicit operator bool() const;

参见C ++ 11 27.5.5.4-1。然而,'明确'对我来说似乎很奇怪。