Bonjour tous.

Je me pose une question existentielle très bête. Comment faire pour surcharger correctement l'opérateur &&. Par correctement, j'entends que dans l'opération a && b, b ne sera évalué que si a.

J'ai bien tenté d'écrire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
public:
        int x;
        A() {
                x = 0;
                std::cout << "création A" << std::endl; };
        operator bool() { return x != 0; }
        A operator&&(const A& other) {
                if(!x)
                        return *this;
                A result;
                result.x = x && other.x;
                return result;
        };
};
mais voila, ce qui me gène c'est que :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
        A a;
        a.x = 0;
        A b;
        bool c = a && A(); // ligne qui me pose un problème
        return 0;
A() est tout de même appelé, alors que si je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
        A a;
        a.x = 0;
        A b;
        bool c = (bool)a && A(); // ligne qui me pose problème
        return 0;
A() n'est plus appelé.

Existe-t-il un moyen d'écrire la surcharge de l'opérateur && afin de garder le comportement standard du langage (ne pas évaluer l'opérande droite s'il n'y en a pas besoin) ?