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 :

passage de variable temporaire en réference


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut passage de variable temporaire en réference
    Salut à tous.
    Comme nous le savons tous, on ne peut pas passer le résultat d'un appel de fonction en tant que référence non constante en argument d'une autre fonction.
    Le code suivant ne compile pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int getint();
    void takeint(int&);
    ...
    takeint(getint);
    Par contre dans le cas de la classe auto_ptr ce code compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    auto_ptr<int> getauto();
    ...
    auto_ptr<int> myauto(getauto());
    myauto=getauto();
    Ca n'aurait rien d'anormal dans le cas d'une autre classe, mais auto_ptr a la particularité de prendre en argument une référence non constante en argument dans son constructeur par défaut et son opérateur d'affectation. Donc logiquement on se retrouve dans le même cas de figure que le premier code, pourtant le compilateur l'accepte.
    Donc ma question: pourquoi?

    Edit: faudrait que je lise un peu mieux le code avant de poster moi, en fait c'est un hack toute bête au niveau de la classe auto_ptr, faites comme si j'avais rien dit!

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    auto_ptr joue des tours avec la résolution de surcharge et les conversions implicites (et si j'ai bonne mémoire, ces tours dépendent du fait que c'est une classe template). J'ai pas trop envie d'expliquer les détails: il faudrait que je les retrouve d'abord car les règles de résolutions de surcharges sont complexes, en particulier quand on fait intervenir les conversions implicites et les templates.

    Un bon point de départ pour ceux qui comprennent l'anglais et veulent approfondir le sujet est
    http://www.informit.com/content/imag...tr_update.html

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    A vrai dire c'est assez simple, auto_ptr contient un opérateur de conversion implicite vers la classe auto_ptr_ref (qui contient simplement un pointeur) qui fait un release.
    Il possède aussi un constructeur et un opérateur d'affectation en prenant un en argument par référence constante et qui ont le même effet que si il s'agissait d'un simple pointeur.

Discussions similaires

  1. [langage] Probleme passage de variables entre modules
    Par Ludo167 dans le forum Langage
    Réponses: 4
    Dernier message: 13/08/2004, 12h25
  2. Passage de variable dans un lien asp
    Par VirginieGE dans le forum ASP
    Réponses: 4
    Dernier message: 27/07/2004, 10h06
  3. [Kylix] passage de variable en Libc
    Par zheng dans le forum EDI
    Réponses: 11
    Dernier message: 06/05/2004, 14h14
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. [langage] Passage de variables...
    Par martijan dans le forum Langage
    Réponses: 8
    Dernier message: 30/07/2003, 09h48

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