Cette réponse de @R. Martinho Fernandes montre que l'idiome safe-bool est apparemment obsolète en C++11, car il peut être remplacé par un simple
explicit operator bool() const;
selon la citation standard dans la réponse §4 [conv] p3
:
Une expression e peut être implicitement convertie en un type
T
si et seulement si la déclarationT t=e;
est bien formée, pour une variable temporaire inventéet
(§8.5). Certains constructions linguistiques exigent qu'une expression soit convertie en une valeur booléenne. Une expressione
apparaissant dans un tel contexte est dite convertie contextuellement enbool
et est bien formée si et seulement si la déclarationbool t(e);
est bien formée, pour une variable temporaire inventée t (§8.5).
La partie mise en évidence montre clairement le "cast implicite explicite" (appelé "conversion contextuelle" dans le standard) tel que décrit par @R. Martinho.
Les "constructions linguistiques" qui nécessitent ce "cast implicite explicite" semblent être les suivantes:
if
,while
,for
(§6.4 [stmt.select] p4
)- opérateurs logiques binaires
&&
et||
(§5.14 [expr.log.and/or] p1
pour les deux) - l'opérateur de négation logique
!
(§5.3.1 [expr.unary.op] p9
) - opérateur ternaire
?:
(§5.14 [expr.cond] p1
) static_assert
(§7 [dcl.dcl] p4
)noexcept
(§15.4 [except.spec] p2
)
Notre hypothèse dans le titre est-elle correcte? J'espère que nous n'avons pas négligé d'éventuels inconvénients.