Boost logo

Boost :

From: Terje Slettebø (tslettebo_at_[hidden])
Date: 2003-06-21 21:09:15


(Because this reply is so late, I cc it, as well)

Sorry for the late reply.

> I #included <gregorian\greg_date.hpp> and <gregorian\parsers.hpp> in my
> code, and they indirectly #include <lexical_cast.hpp>. Here is the warning
I
> get from the compiler (I am using MS Visual C++ 6):
>
> *****************
> d:\documents and
>
settings\administrator\desktop\dev\boost_1_30_0\boost\lexical_cast.hpp(147)
> : warning C4800: 'void *' : forcing value to bool 'true' or 'false'
> (performance warning)
> d:\documents and
>
settings\administrator\desktop\dev\boost_1_30_0\boost\lexical_cast.hpp(146)
> : while compiling class-template member function 'bool __thiscall
> boost::detail::lexical_stream<int,class std::basic_string<char,struct
> std::char_tr
> aits<char>,class std::allocator<char> > >::operator <<(const class
> std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > &)'
>
> and others like this
> *****************
>
> And here is the line that causes this warning. First off, it's not clear
why
> the return should be a bool, and if that was indeed the author's
intention,
> the conversion between the ( stream << input ) which normally should
return
> a stream&, and bool, does not seem to make sense (for one thing the return
> will never be false).
>
> ******************
> bool operator<<(const Source &input)
> {
> return stream << input;
> }
> ******************
>
> Could somebody clarify this.

First, the above warning has been fixed in the latest CVS version (this
issue was brought up a while ago, too). The function is now defined as:

bool operator<<(const Source &input)
{
    return !(stream << input).fail();
}

This removes the warning, and does the same as the implicit conversion to
bool did.

The reason the implicit conversion to bool works is that std::stringstream
has an implicit conversion to void *, to give the stream's state. It returns
zero for fail(), and non-zero otherwise, so converted to bool, it becomes
the same as !fail(), as shown above.

Conversion to void *, rather than the apparently more obvious bool is to
avoid the possibility of it being erroneously used in arithmetic expressions
that way, such as:

int value=cin + cout;

There's also a "safe bool" technique, which avoids the possibility of the
conversion to void * being used for something else, like "delete cout;".
That technique is used in Boost ("safe_bool").

Regards,

Terje


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk