std::basic_ios<CharT,Traits>::operator bool
operator /* unspecified-boolean-type */()const; | (1) | (until C++11) |
explicit operator bool()const; | (2) | (since C++11) |
Checks whether the stream has no errors.
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.
Contents |
[edit]Parameters
(none)
[edit]Return value
[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
#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
[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 |