Cette réponse de @R. Martinho Fernandes montre que l'idiome Safe-Bool est 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 certaines variables temporaires inventéest
(§8.5). Certaines constructions de langage nécessitent qu'une expression soit convertie en valeur booléenne. Une expressione
apparaissant dans un tel contexte serait convertie contextuellement enbool
et est bien formé si et seulement si la déclarationbool t(e);
est bien formée , pour certaines variables temporaires inventées t (§8.5).
La partie en surbrillance montre clairement la "distribution implicite explicite" (appelée "conversion contextuelle" dans la norme) en tant que @R. Martinho l'a dit.
Les "certaines constructions de langage" qui nécessitent que "transtypage explicite implicite" semblent être les suivantes:
if
, while
, for
(§6.4 [stmt.select] p4
)&&
et ||
(§5.14 [expr.log.and/or] p1
pour les deux)!
(§5.3.1 [expr.unary.op] p9
)?:
(§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.
Oui. Ceci est l'exemple pour les problèmes avec seulement des conversions implicites définies par l'utilisateur et des opérateurs de conversion explicites définis par l'utilisateur étaient pratiquement inventé à cause de ce problème et pour remplacer tous les trucs sûrs par quelque chose de beaucoup plus propre et plus logique.