I stumbled across this code.
std::ostringstream str;
/// (some usage)
assert( ! str );
What does ostringstream
signify when used in a bool
context?
Is this possibly an incorrect usage that happens to compile and run?
It tells you if the stream is currently valid. This is something that all streams can do. A file stream, for example, can be invalid if the file was not opened properly.
As a side note, this functionality (testing a stream as a bool) is achieved by overloading explicit operator bool
in C++11 and later and by overloading the void*
cast operator in versions before C++11.
Here is a link containing some examples of why a stream might fail. This isn't specific to string streams, but it does apply to them.
Edit: changed bool
to void*
after Martin York pointed out my mistake.
For reference: ostringstream::operator void*() and ostringstream::operator!().
The expression is valid and evaluates the state of the stream. This feature is more commonly used on input streams:
istringstream is;
is.str( "foo" );
int x;
is >> x;
if ( ! is ) {
cerr << "Conversion failed";
}
I'm not sure how any of the standard streaming functions could cause an ostringstream to go bad, but you could certainly write one yourself.
来源:https://stackoverflow.com/questions/835590/how-would-stdostringstream-convert-to-bool