9

这个答案中,我谈论使用std::ifstream对象的转换bool来测试流是否仍处于良好状态。我查看了 Josuttis 的书以获取更多信息(如果您有兴趣,请参阅第 600 页),结果发现这些iostream对象实际上是重载的operator void*。它在流错误时返回一个空指针(可以隐式转换为false),否则返回一个非空指针(隐式转换为true)。他们为什么不只是超载operator bool

4

3 回答 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 回答