IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Question existentielle] Surcharge de l'opérateur &&


Sujet :

C++

  1. #1
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut [Question existentielle] Surcharge de l'opérateur &&
    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) ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Franchement, j'en serais étonné, car je ne vois pas comment on pourrait savoir s'il faut évaluer l'argument de droite avant d'appeler la fonction operator&&(), et si on appelle la fonction operator&&(), il faudra forcément évaluer les deux arguments.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    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) ?
    Non. C'est une des raisons qui font qu'il faut reflechir une fois de plus que d'habitude avant de surcharger && et ||.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Le seul contexte où tu peux surcharger &&, c'est si ton membre de droite est une expression qui s'évalue de manière retardée.
    Par exemple, Boost.Bind, Boost.Lambda et Boost.Phoenix le surchargent.
    Boost ftw

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Le seul contexte où tu peux surcharger &&, c'est si ton membre de droite est une expression qui s'évalue de manière retardée.
    Par exemple, Boost.Bind, Boost.Lambda et Boost.Phoenix le surchargent.
    Je n'avais pas pensé à ce cas. Je comprends donc mieux pourquoi c'est autorisé, et comment le faire correctement. Merci !

    quoique, je chipote mais ça me semble limite, même avec une expression retardée, puisque l'évaluation d'éventuelles sous-expressions aura quand même lieu, ce qui n'est pas le cas avec &&, non ?

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    La sous-expression utilisera l'opérateur non surchargé.

    Il y a 3 ans, j'avais posté ici un exemple de ce genre pour écrire du pseudo SQL en C++ (Alp, tu ne cherchais pas un MSEL ?)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Question existentielle : les commentaires
    Par ®om dans le forum Langage
    Réponses: 1
    Dernier message: 08/06/2006, 00h20
  3. Question existentielle
    Par jadey dans le forum C++
    Réponses: 12
    Dernier message: 21/04/2006, 15h00
  4. Question existentielle : Que signifie X dans MAC oS X?
    Par oOoOuuhmAn dans le forum Apple
    Réponses: 8
    Dernier message: 03/04/2006, 11h37
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo