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 :

les rvalue reference


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut les rvalue reference
    Bonjour,
    je cherche quelques explications sur les rvalue qui seront utilisées dans la prochaine version du C++.

    En gros, ce que j'ai compris est que l'on pourra utiliser une instance non nommée pour faire des opérations.
    Par exemple on pourra passer en référence une instance d'un class créée sans nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void f(A&& a)
    {
    ...
    }
     
    f(A());
    Si j'ai bien compris, on pourra même faire des bug comme
    ...
    est-ce bien cela ou je n'ai pas compris ce que c'est??
    merci

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    "rvalue reference", tu veux dire ?

    C'est un peu ça, mais ça va plus loin...

    L'article http://www.artima.com/cppsource/rvalue.html est assez bien foutu sur le sujet.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Salut,

    Généralement, une rvalue(Right VALUE) représente... toute expression pouvant se trouver à droite d'un opérateur d'affectation (ou de comparaison)

    L'autre terme "concomitant" est la lvalue (Left VALUE) qui représente... toute expression pouvant se trouver à gauche d'un opérateur d'affectation (ou de comparaison)

    Ainsi, quand tu fais
    i est une lvalue (se trouve à gauche de l'opérateur d'affectation) et 2 est une rvalue (se trouve à droite de l'opérateur d'affectation)

    Si on parle d'expression ici, c'est parce que dans le cas d'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = obj1.getA()+obj1.getB()*obj1.getC();
    tu te rend compte que pour évaluer la valeur à donner à i, il faut commencer:
    1. obtenir la valeur renvoyée par getA
    2. obtenir la valeur renvoyée par getB
    3. obtenir la valeur renoyée par getC
    4. multiplier la valeur obtenue en (2) par la valeur obtenue en (3)
    5. additionner la valeur obtenue en (1) par le résultat de (4)
    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

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    EN faite ma question viens de cette discutions :
    http://www.developpez.net/forums/sho...83#post3254883
    et c'est donc rvalue reference (je ne savait pas que rvalue était autre chose )

    J'ai regardé un peu le lien et je me pose déjà des questions sur l'implementation du swap avec les rvalue reference

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T> swap(T& a, T& b)
    {
        T tmp(std::move(a));
        a = std::move(b);   
        b = std::move(tmp);
    }
    Ce que je comprend est que T doit avoir un constructeur et un operateur = prenant une rvalue reference. Cela reviendrai à pouvoir partager une implémentation privé de la class, n'est ce pas?
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T> f(T& a)
    {
        T tmp(std::move(a));
        a = 1;
    }
    quand a sera affecté par 1, tmp le sera aussi c'est bien ça???

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    de même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T> f(T& a)
    {
        T tmp;
        //traitement sur tmp
        ...
        a = std::move(tmp);
    }
    1- la memoire appartenant à a sera detruite si personne de l'utilise
    2- a prendra la memoire de tmp,
    3- tmp est détruit, aucune memoire n'est détruite.
    C'est bien ca?

  6. #6
    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
    Par défaut
    Tout l'intérêt des rvalue references c'est de distinguer les rvalues des lvalues constantes, ce que le langage actuel ne permettait pas.

    En particulier, on peut se permettre de modifier des rvalues pour transférer leur valeur, ce qu'on peut pas vraiment se permettre avec les lvalues (constantes ou non).

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Y as un truc que je ne pige pas .
    Lors que l'on fera

    a et b devront swapper leur mémoire???
    Ou alors c'est juste l'exemple?

Discussions similaires

  1. [c++0x] Lumière sur les rvalue references
    Par Arzar dans le forum Langage
    Réponses: 39
    Dernier message: 08/10/2009, 14h56
  2. [Excel] Supprimer les cellules references
    Par VlaMonPseudo dans le forum Excel
    Réponses: 2
    Dernier message: 28/06/2007, 13h43

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