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