Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why don't iostream objects overload operator bool?

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?

like image 476
Michael Kristofik Avatar asked Aug 26 '09 13:08

Michael Kristofik


2 Answers

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.

like image 133
Michael Kristofik Avatar answered Oct 23 '22 01:10

Michael Kristofik


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? .

like image 38
Potatoswatter Avatar answered Oct 22 '22 23:10

Potatoswatter