在这个答案中,我谈论使用std::ifstream
对象的转换bool
来测试流是否仍处于良好状态。我查看了 Josuttis 的书以获取更多信息(如果您有兴趣,请参阅第 600 页),结果发现这些iostream
对象实际上是重载的operator void*
。它在流错误时返回一个空指针(可以隐式转换为false
),否则返回一个非空指针(隐式转换为true
)。他们为什么不只是超载operator bool
?
问问题
3772 次
3 回答
13
看起来 C++0x 标准第 27.4.4.3 节有答案(强调我的)。
operator unspecified-bool-type() const;
返回: If
fail()
then 在布尔上下文中将评估为 false 的值;否则将在布尔上下文中评估为 true 的值。 返回的值类型不能转换为int
.注意:此转换可用于
bool
预期 a 的上下文(例如,if 条件);但是,不允许int
可能发生的隐式转换(例如 to ),从而消除了一些用户错误的来源。bool
于 2009-08-26T13:55:54.750 回答
8
这是“安全布尔”问题的一个实例。
这是一篇好文章:http ://www.artima.com/cppsource/safebool.html 。
C++0x 有助于explicit
转换函数的情况,以及 Kristo 提到的变化。另请参阅C++11 中的安全布尔习语是否已过时?.
于 2011-08-05T06:16:34.700 回答
0
最新的 C++11 要求:
explicit operator bool() const;
参见 C++11 27.5.5.4-1。不过,“显式”对我来说似乎很奇怪。
于 2012-05-15T06:15:28.760 回答