operator /* unspecified-boolean-type */() const; | (1) | (until C++11) |
explicit operator bool() const; | (2) | (since C++11) |
Checks whether the stream has no errors.
false
in a boolean context if fail()
returns true
, otherwise returns a value that evaluates to true
in a boolean context.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.
(none).
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.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.
#include <iostream> #include <sstream> int main() { std::istringstream s("1 2 3 error"); int n; std::cout << std::boolalpha << "s is " << static_cast<bool>(s) << '\n'; while (s >> n) std::cout << n << '\n'; std::cout << "s is " << static_cast<bool>(s) << '\n'; }
Output:
s is true 1 2 3 s is false
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 |
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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool