How I can prevent the last line of this code from compiling?
#include <boost/optional.hpp>
int main()
{
typedef boost::optional<int> int_opt;
int_opt opt = 0;
bool x = opt; // <- I do not want this to compile
}
The last line doesn't examine opt
's contained int value, but instead compiles as a type conversion to bool, and doesn't seem to be what the user intended.
The safe bool idiom seems to be relevant here?
The whole point of
boost::optional
is to enable code like this:So the implicit conversion to
bool
is a feature, and should not be prevented from compiling.The problem that you describe used to be the case for the older versions of Boost. Ever since 1.56 release
boost::optional
has an explicit conversion tobool
and the code that you show does not compile anymore (exactly the way you wanted). See here.If you're using
optional
then you need to be able to determine if it's set before using it. The way this is implemented is with the (effectively bool) conversion.It doesn't in my mind follow that the user didn't want what's actually written there: They should know that it's an
optional
and that they're checking it for validity.Since the conversion is a built in part of
boost::optional
I'm not aware of any way to directly remove it.You could of course implement a wrapper class for your particular
int
need that provides just the parts of theoptional
interface that you want, possibly with an explicit function that checks validity.Alternately you could always use
template<class T> inline T const* get_pointer ( optional<T> const& opt ) ;
or its non-const version when working withoptional
s to make it explicit what's happening.