std::basic_ios<CharT,Traits>::operator bool - cppreference.com (original) (raw)
operator /* unspecified-boolean-type */() const; | (1) | (until C++11) |
---|---|---|
explicit operator bool() const; | (2) | (since C++11) |
Checks whether the stream has no errors.
Returns a value that evaluates to false in a boolean context if fail() returns true, otherwise returns a value that evaluates to true in a boolean context.
Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail().
This operator makes it possible to use streams and functions that return references to streams as loop conditions, resulting in the idiomatic C++ input loops such as while (stream >> value) {...} or while (std::getline(stream, string)) {...}. Such loops execute the loop's body only if the input operation succeeded.
[edit] Parameters
(none)
[edit] Return value
A value that evaluates to true in a boolean context if the stream has no errors, a value that evaluates to false in a boolean context otherwise.
true if the stream has no errors, false otherwise.
[edit] Notes
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.
In C++98, operator bool could not be provided directly due to the safe bool problem. The initial solution in C++98 is to provide operator void*, which returns a null pointer if fail() returns true or a non-null pointer otherwise. It is replaced by the resolution of LWG issue 468, which allows Safe Bool idiom to be applied.
Since C++11, conversion functions can be explicit. The resolution of LWG issue 1094 introduced the explicit operator bool and the boolean conversion is now safe.
[edit] Example
Output:
s is true 1 2 3 s is false
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 468 | C++98 | operator void* was provided | a conversion function to an unspecified boolean type is provided instead |
[edit] See also
The following table shows the value of basic_ios accessors (good(), fail(), etc.) for all possible combinations of ios_base::iostate flags:
ios_base::iostate flags | basic_ios accessors | |||||||
---|---|---|---|---|---|---|---|---|
eofbit | failbit | badbit | good() | fail() | bad() | eof() | operator bool | operator! |
false | false | false | true | false | false | false | true | false |
false | false | true | false | true | true | false | false | true |
false | true | false | false | true | false | false | false | true |
false | true | true | false | true | true | false | false | true |
true | false | false | false | false | false | true | true | false |
true | false | true | false | true | true | true | false | true |
true | true | false | false | true | false | true | false | true |
true | true | true | false | true | true | true | false | true |