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 unshared_ptr
membre appelé p et que j'ai cette méthodeoperator bool() const { return p; }
:, la compilation échoue. C'est stupide IMO.Réponses:
Oui. Ceci est l' exemple des problèmes avec seulement des conversions implicites définies par l'utilisateur et des opérateurs de conversion explicites définis par l'utilisateur ont été pratiquement inventés à cause de ce problème et pour remplacer tous les trucs de safe-bool par quelque chose de beaucoup plus propre et plus logique.
la source
Je n'appellerais pas cela «obsolète». Tout le monde ne fait pas encore le saut vers C ++ 11 (même pas un an ). Et même si un bon nombre de codeurs l'étaient, la possibilité de garder le code rétrocompatible serait un must, étant donné que ce genre d'idiome semble plus judicieux pour les bibliothèques que pour les programmes proprement dits.
la source
--std=c++0x
que le dernier clou était enfoncé dans le cercueil des normes et ils ont décidé de mettre le nom sur la spécification ISO. À moins que vous ne soyez un drogué de métaprogrammation de modèles vraiment profond, les détails de la spécification C ++ 11 par rapport à ce que les gens utilisaient sont probablement sans conséquence pour vous ... ce qui signifie qu'il était plus ancien que 2011 pour presque toutes les raisons pratiques même alors. Et maintenant, à mon horloge, il est presque 2015.