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 le devis 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). Certaines constructions de langage nécessitent qu'une expression soit convertie en valeur booléenne. Une expressione
apparaissant dans un tel contexte est dite contextuellement convertie 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 en surbrillance montre clairement le "cast explicite implicite" (appelé "conversion contextuelle" dans la norme) comme @R. Martinho l'a dit.
Les "certaines constructions de langage" qui nécessitent que "cast explicite implicite" 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 conditionnel
?:
(§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 négligé aucun inconvénient potentiel.
operator bool
. Par exemple, si j'ai un shared_ptr
membre appelé p et que j'ai cette méthode operator bool() const { return p; }
:, la compilation échoue. C'est stupide IMO.