4 votes

"if (var)" utilise la conversion numérique au lieu de la conversion booléenne

Pourquoi if (var) ... utilise une conversion numérique au lieu d'une conversion booléenne ? J'ai une classe qui implémente les deux :

operator int() { ....}
operator bool() { ....}

mais si j'utilise :

if (my_class_var) ....;

puis le int est utilisée à la place de la conversion boolean ? !!?!

EDIT : Comme le dit versedmarald, c'est correct. J'ai trouvé la différence J'utilise en fait :

operator int() { ....}
operator bool() const { ... }

Toujours fasciné, pourquoi cette différence ? gcc version 4.6.2

3voto

jogojapan Points 26661

Si ce que vous dites est vrai, je pense que votre compilateur est en violation de la norme :

(§6.4/4) La valeur d'une condition qui est une déclaration initialisée dans une instruction autre qu'une instruction switch est la valeur de la variable déclarée convertie contextuellement en bool (clause 4). Si cette conversion est mal formée, le programme est mal formé. [...]

(Pour être clair, ceci s'inscrit dans le contexte du §6.4, qui décrit if y switch déclarations.)

1voto

verdesmarald Points 6632

Il ne le fait pas (en utilisant g++ au moins). Je pense qu'il y a une erreur dans vos opérateurs de conversion.

#include <iostream>
class A {
public:
    operator int() { return 1; }
};

class B {
public:
    operator int() { return 1; }
    operator bool() { return false; }
};

int main() {
    A a;
    B b;

    if (a)
        std::cout << "true\n";
    else
        std::cout << "false\n";

    if (b)
        std::cout << "true\n";
    else
        std::cout << "false\n";
}

Sorties :

true
false

1voto

ForEveR Points 28133

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X