I am pretty surprised that this struct
, which is only explicitly convertible to bool
, works fine inside a if
statement:
struct A
{
explicit operator bool( ) const
{
return m_i % 2 == 0;
}
int m_i;
};
int main()
{
A a{ 10 };
if ( a ) // this is considered explicit
{
bool b = a; // this is considered implicit
// and therefore does not compile
}
return 0;
}
Why is it so? What is the design reason behind it in the C++ Standard? I personally find more explicit the second conversion than the first one. To make it even more clear, I would have expected the compiler forcing to have the following for both the cases:
int main()
{
A a{ 10 };
if ( (bool)a )
{
bool b = (bool)a;
}
return 0;
}
So the expression of the condition in
if
must be contextually convertible tobool
, which means that explicit conversions are allowed.This is mode most likely done because the condition of
if
can only evaluate to a boolean value, so by sayingif(cond)
you are explicitly stating you wantcond
to be evaluated to a boolean value.