Why don't iostream objects overload operator bool?

旧时模样 提交于 2019-11-26 21:49:03

问题


In this answer I talk about using a std::ifstream object's conversion to bool to test whether the stream is still in a good state. I looked in the Josuttis book for more information (p. 600 if you're interested), and it turns out that the iostream objects actually overload operator void*. It returns a null pointer when the stream is bad (which can be implicitly converted to false), and a non-null pointer otherwise (implicitly converted to true). Why don't they just overload operator bool?


回答1:


This is an instance of the "safe bool" problem.

Here is a good article: http://www.artima.com/cppsource/safebool.html .

C++0x helps the situation with explicit conversion functions, as well as the change that Kristo mentions. See also Is the safe-bool idiom obsolete in C++11? .




回答2:


It looks like the C++0x standard section 27.4.4.3 has the answer (emphasis mine).

operator unspecified-bool-type() const;

Returns: If fail() then a value that will evaluate false in a boolean context; otherwise a value that will evaluate true in a boolean context. The value type returned shall not be convertible to int.

Note: This conversion can be used in contexts where a bool is expected (e.g., an if condition); however, implicit conversions (e.g., to int) that can occur with bool are not allowed, eliminating some sources of user error.




回答3:


The newest C++11 requires that:

explicit operator bool() const;

See C++11 27.5.5.4-1. The 'explicit' seems odd to me, though.



来源:https://stackoverflow.com/questions/1334858/why-dont-iostream-objects-overload-operator-bool

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!