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

Langage C++ Discussion :

c++0x r-value reference


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut c++0x r-value reference
    Je suis en train de tester les nouveautés du prochain standard à l'aide de gcc 4.5.
    Je me demande pourquoi dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void f(int && i);
    void f(int &i);
     
    void g(int && i)
    {
       f(i);
    }
    le compilateur choisit la version & de f et non la version &&.

    Pour avoir l'utilisation de la version && il faut passer par une fonction intermédiaire de style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void g(int && i)
    {
       f( std::move(i) );
    }
    J'aimerai donc comprendre l'intérêt de ce comportement ( j'imagine qu'il y en a un ).

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Je pense que pour comprendre il faut revenir à l'interet même des r-value référence : ie pouvoir lié une référence à une r-value, ce qui avait n'était possible qu'avec des des références constantes, maintenant on peut le faire avec de nouvelles références, nommé r-value référence (et les anciennes sont donc des l-value référence).

    Cependant (pour des raisons de retro-compatibilité et car la logique exite toujours), on peut toujours lié une l-value référence constante à une r-value ou une r-value constante (sous-entendue sur un objet qualifié de const). Il faut donc choisir une priorité pour résoudre les surcharges, et AMA, le choix de la priorité aux r-value référence vient de la raison même qu'elles ont d'exister (ie servir à lié une référence sur un r-value).

    Donc au final on obtient que si l'expression est une r-value la surcharge avec une r-value référence aura la priorité, si l'expression est une l-value la surcharge avec une l-value référence aura la priorité (je passe sous silence les histoires de priorité entre les expression qualifié de constante et les autres, ca n'a aucun interet ici).

    Reprenons le code que tu proposes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void f(int && i);
    void f(int &i);
     
    void g(int && i)
    {
       //quel est la catégorie de I ?
       f(i);
    }
    Voilà la question que l'on doit se poser pour savoir quel f sera appelé. Ici il s'agit d'une l-value, ca sera dont la version avec une l-value référence qui sera appelé. Si tu passes par move (dont le code pourrait être un simple static_cast), ca devient une x-value (la catégorie de l'expression d'une fonction retournant une r-value est une x-value) donc en particulier une r-value, et la version appelé sera celle avec une r-value référence.

  3. #3
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    En fait la r-value reference est vraiment un nouveau concept, à ne pas comprendre comme un nouveau "type" de référence mais plus comme un nouveau contexte pour lequel on peut créer une référence ordinaire.

    Il faut aussi comprendre qu'une r-value reference retournée par une fonction est une r-value (et donc un comportement différent du passage d'argument). Bref tout ça n'est pas simple.

    merci

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    mnemonique facile, si tu utilises une variable avec un nom, c'est une l-value.
    Sinon, c'est une r-value

    move transforme la premiere en deuxieme

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    @Joel F : Je le trouve un peu imparfait ton moyen mnemonique. La première partie je suis d'accord, si la variable à un nom alors c'est une l-value. Par contre si ca n'a pas de nom ca peut-être une l-value. Genre l'expression foo() avec foo retournant une l-value reference est aussi une l-value.

Discussions similaires

  1. Erreur "not-null property references a null or transient value"
    Par mactar85 dans le forum Frameworks Web
    Réponses: 2
    Dernier message: 14/08/2013, 09h06
  2. [Joomla!] Chronoforms: Deprecated: Assigning the return value of new by reference is deprecated
    Par sitws dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 26/11/2011, 15h21
  3. Réponses: 5
    Dernier message: 30/12/2010, 11h46
  4. Réponses: 6
    Dernier message: 29/11/2010, 16h09
  5. [Joomla!] Expected to be a reference, value given
    Par Galdon dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 11/03/2010, 09h14

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