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 :

[bug] Initialisation invalide d'une référence non const à partir d'un temporaire.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut [bug] Initialisation invalide d'une référence non const à partir d'un temporaire.
    bonjour.

    J'ai défini une petite classe comme suit:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class solid_pos: public point
    {
        angle<SOLID_ANGLE_PREC> dir;
     
        public:
        solid_pos(const point & pt=point(),angle<SOLID_ANGLE_PREC> agl=angle<SOLID_ANGLE_PREC>());
        solid_pos(const solid_pos & pos);
        inline solid_pos & operator-()const;
     
    };
    or dans l'implémentation de operator -:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline solid_pos & solid_pos::operator-()const
    {
        return solid_pos(point::operator-(),-dir); //plante ici
    }
    il me fait l'erreur suivante sur le return:
    ...solid_pos.h|28|erreur: invalid initialization of non-const reference of type ‘solid_pos&’ from a temporary of type ‘solid_pos’|
    ce que j'ai du mal à comprendre vu qu'une référence doit forcément s'initialiser à partir d'un objet...

    bref, un éclairement serait bienvenu.


    merci.

  2. #2
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Tu ne peux pas retourner une référence sur un objet qui n'existe plus.

    Par contre, tu peux retourner une référence sur un objet constant, car le C++ s'arrange pour ne pas le supprimer tant <wrong>qu'il y a une référence dessus.</wrong> que la référence constante est en vie.

  3. #3
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par hiura Voir le message
    Tu ne peux pas retourner une référence sur un objet qui n'existe plus.

    Par contre, tu peux retourner une référence sur un objet constant, car le C++ s'arrange pour ne pas le supprimer tant qu'il y a une référence dessus.
    heu, qu'apelle-tu exactement un objet constant ? un objet revoyé avec une fonction const ? si oui, c'est déjà le cas...

  4. #4
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par hiura
    car le C++ s'arrange pour ne pas le supprimer tant qu'il y a une référence dessus.
    Le C++ Aurait-il un ramasse miettes ?

  5. #5
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    heu, qu'apelle-tu exactement un objet constant ? un objet revoyé avec une fonction const ? si oui, c'est déjà le cas...
    Non, mais par une fonction qui retourne un objet const :
    Citation Envoyé par Lucien63 Voir le message
    Le C++ Aurait-il un ramasse miettes ?
    J'avais lu le principe du ramasse miettes y a vraiment longtemps, mais d'après ce que je me souviens il ne s'agit pas de ça.
    Soit le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T f(void);
    void g(void) {
      const T& = f();
    } // T est détruit, l'objet auquel il fait référence aussi.
    Le C++ va, dans ce cas particulier, garder en mémoire l'objet const retourné par f en mémoire et le détruire que quand la référence sera détruite.

    Lire http://herbsutter.wordpress.com/2008...portant-const/

    EDIT : ce code est faux, voir mon prochain message ( bien plus bas ) .

  6. #6
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T f(void);
    
    void g(void) {
      const T& = f(); // ou est le type et ou est le nom de la variable ?
    } // T est détruit, l'objet auquel il fait référence aussi.
    T est un type ou une variable ?

    T est détruit, l'objet auquel il fait référence aussi
    Par quel artifice l'objet est-il détruit ?

  7. #7
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    Le C++ Aurait-il un ramasse miettes ?

    Pas du tout..

  8. #8
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Citation Envoyé par Goten
    Citation Envoyé par Lucien63
    Le C++ Aurait-il un ramasse miettes ?
    Pas du tout.
    Ça je savais, mais je disais cela en rapport à la reponse de hiura.
    Car je n'ai jamais vu que la destruction de toutes les références sur un objet fesait que c++ détruisait l'objet auquel elle fesaient références.

    Citation Envoyé par loufoque
    Citation Envoyé par Lucien63
    T est un type ou une variable ?
    T est un type.
    Je m'en doutais, mais je ne savait pas "que l'on pouvait détruire un Type" :
    Citation Envoyé par hiura
    // T est détruit,
    C'est pour cela que je posait la question !

    La portée
    Idem que plus haut. La variable référence est détruite ok, mais comment peut tu dire que l'objet auquel elle fait référence est détruit ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/03/2010, 14h34
  2. Réponses: 12
    Dernier message: 23/05/2007, 21h40
  3. Piloter une application non office à partir d'access
    Par Marmotine dans le forum Access
    Réponses: 2
    Dernier message: 23/03/2006, 01h08
  4. Initialiser une référence membre d'une classe
    Par NicolasJolet dans le forum C++
    Réponses: 2
    Dernier message: 18/03/2006, 12h14
  5. Réponses: 10
    Dernier message: 24/09/2005, 19h19

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