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 :

Valeur renvoyée par un opérateur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Par défaut Valeur renvoyée par un opérateur
    Bonjour,

    J'ai encore une question à propos de mes opérateurs surchargés :

    Si je cherche à surcharger + dans une de mes classes, après avoir correctement surchargé +=, j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename Elem>
    PolyD<Elem>& PolyD<Elem>:: operator + (PolyD V)
    { 
    V += (*this); 
    return V;
    }
    Ce qui fonctionne mais réflexion faite ça devrait planter royalement, vu que je renvois par référence un objet de portée locale, non ?
    Je vais devenir fou avec ces opérateurs partout ...

    merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Effectivement, tu renvoie une référence vers quelque chose qui sera détruit au moment de quitter la fonction...

    Ceci dit, assez bizarement, (en fait non: de manière très logique, si on suit la norme), si tu récupère la valeur de retour sous la forme d'une référence constante, cela fonctionnera sans problème, car une référence constante permet la construction d'un objet (qui deviendra temporaire pour la fonction dans laquelle tu récupère cette valeur)

    A ce sujet, je te proposerais bien la lecture (en anglais) de cet article

    Ceci dit, l'opérateur += peut renvoyer une référence parce qu'il renvoie... l'objet modifié, alors que l'opérateur + seul renvoie normalement... un nouvel objet, qui n'est donc ni l'opérande de gauche (l'objet en "cours") ni celui de droite (qui est donné en paramètre), il ne devrait donc pas renvoyer une référence

    Ce qu'il faudrait normalement faire, c'est:
    1. créer une variable du type ad-hoc qui soit la copie de l'objet en cours (*this)
    2. utiliser (éventuellement) l'opérateur += sur cette variable en donnant comme opérande de droite l'objet passé en argument
    3. renvoyer cette variable

    Sur une classe MaClasse, l'opérateur se présenterait donc sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MaClasse MaClasse::operator+(const MaClasse& op) const
    {
        MaClasse temp= *this;
        temp+=op;
        return temp;
    }
    Nota: il n'est pas impossible que l'idiome copy and swap te vienne en aide pour une partie du travail
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    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
    Par défaut
    Ceci dit, assez bizarement, (en fait non: de manière très logique, si on suit la norme), si tu récupère la valeur de retour sous la forme d'une référence constante, cela fonctionnera sans problème, car une référence constante permet la construction d'un objet (qui deviendra temporaire pour la fonction dans laquelle tu récupère cette valeur)
    On a eu cette discussion récemment avec un ami, et j'avoue que je veux bien une clarification là-dessus. Le code suivant est valide de manière incontestable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    A f() 
    { 
      A a; 
      return a; 
    }
     
    int main()
    {
      const A& localA = f();
      ...
    }
    Par contre, le code suivant fait planter gcc à l'utilisation de localA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    const A& f() 
    { 
      A a; 
      return a; 
    }
     
    int main()
    {
      const A& localA = f();
      ...
    }
    En fait, le problème qu'on voit, c'est que autant, dans le cas de la valeur de retour, le compilateur sait statiquement où elle est allouée, et peut donc sans problème augmenter sa durée de vie, autant, dans le cas d'un renvoi de référence d'un objet alloué sur la pile en train d'être détruite, ce ne peut être fait que dynamiquement. Mais pourtant, ne pas le faire rompt le fait que la durée de vie d'un objet est étendu à celle de la référence constante...

    Donc, bug de gcc ou incompréhension de la norme de ma part ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/09/2007, 15h59
  2. [Windev 9] Valeur renvoyée par une fenêtre
    Par Romanops dans le forum WinDev
    Réponses: 10
    Dernier message: 04/01/2007, 17h54
  3. Valeur renvoyée par interrupteur (check box)
    Par nath-0-0 dans le forum WinDev
    Réponses: 8
    Dernier message: 29/11/2006, 16h33
  4. Réponses: 1
    Dernier message: 31/07/2006, 13h54
  5. [SQL] php et recuperation d'une valeur renvoyée par une fonction sql
    Par highman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/06/2006, 15h42

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