为什么iostream对象不重载运算符bool?

9
这个答案中,我谈到了使用std::ifstream对象的转换为bool来测试流是否仍处于良好状态。我在Josuttis书中查找更多信息(如果您感兴趣,可以看看第600页),结果发现对象实际上重载了operator void*。当流不好时,它返回一个空指针(可以隐式转换为false),否则返回非空指针(隐式转换为true)。为什么他们不直接重载operator bool呢?
3个回答

13

看起来C ++0x标准的第27.4.4.3节有答案(重点在于我)。

operator unspecified-bool-type() const;
如果fail()返回值为假,那么返回一个在布尔上下文中会被视为假的值;否则返回一个在布尔上下文中会被视为真的值。需要注意的是,返回的值类型不能转换为int。这种转换可以用于期望布尔值的情况(例如if条件语句),但不允许发生隐式转换(例如转换为int),从而消除了一些用户错误的来源。

这个答案已经过时了。它没有被标准化,因为添加了显式转换函数。 - Potatoswatter

8

0

最新的C++11要求:

explicit operator bool() const;

请参阅C++11 27.5.5.4-1。尽管“explicit”对我来说似乎有些奇怪。


1
“explicit” 是添加它的原因。这样的一个“explicit”转换函数只有在它是唯一的转换时才会应用,此时它将把 iostream 转换为 bool,但不会通过中间的 bool 转换将其转换为 int。阅读本页面上的其他答案以了解安全布尔习惯用法。 - Potatoswatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接