web-dev-qa-db-fra.com

L'idiome Safe-Bool est-il obsolète en C ++ 11?

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éclaration T t=e; Est bien formée, pour certaines variables temporaires inventées t (§8.5). Certaines constructions de langage nécessitent qu'une expression soit convertie en valeur booléenne. Une expression e apparaissant dans un tel contexte serait convertie contextuellement en bool et est bien formé si et seulement si la déclaration bool 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)
  • 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.

172
Xeo

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.

123
Puppy