En C++03, vous devez utiliser la fonction idiome bool sûr pour éviter les mauvaises choses :
int x = my_object; // this works
En C++11, vous pouvez utiliser une conversion explicite :
explicit operator bool() const
{
// verify if valid
return is_valid;
}
De cette façon, vous devez être explicite quant à la conversion en bool, de sorte que vous ne pouvez plus faire des choses folles par accident (en C++, vous pouvez toujours faire des choses folles exprès) :
int x = my_object; // does not compile because there's no explicit conversion
bool y = bool(my_object); // an explicit conversion does the trick
Cela fonctionne toujours normalement dans des endroits comme if
y while
qui nécessitent une expression booléenne, car la condition de ces déclarations est converti en contexte en bool :
// this uses the explicit conversion "implicitly"
if (my_object)
{
...
}
Ceci est documenté dans §4 [conv] :
Une expression e
peut être implicitement converti à un type T
si et seulement si la déclaration T t=e;
est bien formé, pour une variable temporaire inventée t
(§8.5). Certaines constructions du langage exigent qu'une expression soit convertie en une valeur booléenne. Une expression expression e
apparaissant dans un tel contexte est dit être converti contextuellement en bool
et est bien formée si et seulement si la déclaration bool t(e);
est bien formé, pour une certaine variable temporaire inventée t
(§8.5). L'effet de l'une ou l'autre conversion implicite est le même que d'effectuer la déclaration et l'initialisation, puis d'utiliser la variable temporaire comme résultat de la conversion.
(Ce qui fait la différence, c'est l'utilisation de bool t(e);
au lieu de bool t = e;
.)
Les endroits où cette conversion contextuelle en bool se produit sont les suivants :
- les conditions de
if
, while
et for
déclarations ;
- les opérateurs de négation logique
!
, conjonction logique &&
et la disjonction logique ||
;
- l'opérateur conditionnel
?:
;
- l'état de
static_assert
;
- l'expression constante facultative de la
noexcept
spécificateur d'exception ;