Il y a deux used-defined implicit conversion chains
.
Premièrement - class -> bool -> no conversion
Deuxièmement - class -> int -> bool
n3337 4/2
Remarque : les expressions d'un type donné seront implicitement converties en d'autres types dans plusieurs contextes :
- Lorsqu'elle est utilisée dans la condition d'une instruction if ou d'une instruction d'itération (6.4, 6.5). Le type de destination est bool.
n3337 4/3
L'effet de l'une ou l'autre conversion implicite est le même que l'exécution de la commande et l'initialisation, puis d'utiliser la variable temporaire comme résultat de la conversion.
Les citations signifient qu'en réalité
if (class_var)
es
if (bool _ = class_var)
n3337 13.3.3/1
Compte tenu de ces définitions, une fonction viable F1 est définie comme une meilleure fonction qu'une autre fonction viable F2 si, pour tous les arguments i, ICSi(F1) n'est pas une séquence de conversion plus mauvaise que ICSi(F2), et alors
- le contexte est une initialisation par conversion définie par l'utilisateur (voir 8.5, 13.3.1.5 et 13.3.1.6) et la séquence de conversion standard du type de retour (voir 8.5, 13.3.1.5 et 13.3.1.6). la séquence de conversion standard du type de retour de F1 vers le type de destination (c'est-à-dire le type de l'élément l'entité initialisée) est une meilleure séquence de conversion que la séquence de conversion standard du type de retour de F2 vers le type de destination. du type de retour de F2 vers le type de destination. [Exemple :
struct A {
A();
operator int();
operator double();
} a;
int i = a; // a.operator int() followed by no conversion
//is better than a.operator double() followed by
//a conversion to int
float x = a; //ambiguous: both possibilities require conversions,
//and neither is better than the other
- exemple de fin
Le compilateur doit donc choisir operator bool
puisque class -> bool -> no standart conversion
est meilleur que class -> int -> standard conversion to bool