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
Tsi 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 expressioneapparaissant dans un tel contexte est dite contextuellement convertie enboolet 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] p1pour 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_ptrmembre appelé p et que j'ai cette méthode operator bool() const { return p; }:, la compilation échoue. C'est stupide IMO.