explicit specifier doesn't seem to work when converting an object to bool
Contextual conversion is special; since C++11, explicit
conversion functions will be considered in contextual conversions.
(emphasis mine)
(since C++11)
In the following contexts, the type
bool
is expected and the implicit conversion is performed if the declarationbool t(e);
is well-formed (that is, an explicit conversion function such as explicit T::operator bool() const; is considered). Such expression e is said to be contextually converted to bool.
- the controlling expression of if, while, for;
- the operands of the built-in logical operators !, && and ||;
- the first operand of the conditional operator ?:;
- the predicate in a static_assert declaration;
- the expression in a noexcept specifier;
- the expression in an explicit specifier; (since C++20)
- the predicate of a contract attribute. (since C++20)
That means for if (b2)
, b2
will be converted to bool
implicitly by B::operator bool()
even it's declared as explicit
.
Read further in your own link. Contextual conversions occur implicitly even for explicit
conversions:
Contextual conversions
In the following contexts, the type
bool
is expected and the implicit conversion is performed if the declarationbool t(e)
; is well-formed (that is, an explicit conversion function such asexplicit T::operator bool() const;
is considered). Such expressione
is said to be contextually converted tobool
.
- the controlling expression of
if
,while
,for
;- the operands of the built-in logical operators
!
,&&
and||
;- the first operand of the conditional operator
?:
;- the predicate in a
static_assert
declaration;- the expression in a
noexcept
specifier;- the expression in an
explicit
specifier;- the predicate of a contract attribute.