Il existe deux chaînes de conversion implicite définies par l'utilisateur
.
Première - classe -> bool -> pas de conversion
Deuxième - classe -> int -> bool
n3337 4/2
Remarque : les expressions d'un certain type seront implicitement converties en d'autres types dans plusieurs contextes :
— Lorsqu'elles sont utilisées dans la condition d'une instruction if ou d'une boucle (6.4, 6.5). Le type de destination est bool.
n3337 4/3
L'effet de toute conversion implicite est le même que d'effectuer la déclaration, l'initialisation puis d'utiliser la variable temporaire comme résultat de la conversion.
Les guillemets signifient cela vraiment
if (class_var)
est
if (bool _ = class_var)
n3337 13.3.3/1
Étant donné ces définitions, une fonction viable F1 est définie comme étant 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 pire que ICSi(F2), et ensuite
— le contexte est une initialisation par une 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 de F1 vers le type de destination (c'est-à-dire le type du l'entité en cours d'initialisation) est une meilleure séquence de conversion que la séquence de conversion standard de le 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() suivi d'aucune conversion
// est meilleur que a.operator double() suivi de
// une conversion en int
float x = a; // ambigu : les deux possibilités nécessitent des conversions,
// et aucune n'est meilleure que l'autre
— fin d'exemple
Donc, le compilateur devrait choisir operator bool
, car classe -> bool -> pas de conversion standard
est meilleur que classe -> int -> conversion standard en bool