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 :

rvalue reference et lvalue


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut rvalue reference et lvalue
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream("Log file", std::ios::app) << "Log message\n";
    Appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //basic_ostream& operator<<(const void* p);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::ofstream("Log file", std::ios::app) log_file;
    log_file << "Log message\n";
    Appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //template<class traits>
    //basic_ostream<char,traits>&
    //operator<<(basic_ostream<char,traits>&, char);
    Pourquoi est-il nécéssaire d'avoir un ostream qui soit
    une lvalue et non une rvalue, j'ai du mal à voir clairement le problème

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream("Log file", std::ios::app) << "Log message\n";
    ça voudrais dire appeler la méthode operator()<< pour un objet anonyme, mais alors... quand ferais tu le close()?
    Certains en diront plus car je veux pas trop m'avancer sur le sujet des lvalues et rvalues, j'ai pas lu assez de chose sur le sujet. Mais voila ma vision

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    ok je viens de comprendre c'est juste que la version void* est défnit dans la classe et que la version char est non membre de la classe (accéder via Koenig lookup) et qu'on ne peut pas binder une rvalue avec une reférence non const

    l'exemple viens de ce site
    http://www.open-std.org/jtc1/sc22/wg...004/n1690.html

    mais il doit y avoir une coquille car il ne s'agit pas d'un char mais d'un char* mais le problème reste identique

  4. #4
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Bonjour,

    Citation Envoyé par Astraya
    [...] quand ferais tu le close()?
    Il est appelé par le destructeur de l’objet anonyme qui est appelé automatiquement à la fin de l’expression.

    Citation Envoyé par guillaume07
    c'est juste que la version void* est défnit dans la classe et que la version char est non membre de la classe
    C’est exactement ça :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ofstream(/*...*/) << "..."; // marche pas, car cet opérateur est non membre
                                // et ofstream est pris de manière non const.
    ofstream(/*...*/) << 2; // marche, car cet opérateur est membre.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par nowahn Voir le message

    C’est exactement ça :
    Code C++ :
    ofstream(/*...*/) << "..."; // marche pas, car cet opérateur est non membre // et ofstream est pris de manière non const. ofstream(/*...*/) << 2; // marche, car cet opérateur est membre.
    et de bien comprednre qu'une rvalue ( ici plus précisement une variable temporaire) ne peut pas être binder avec une reférence non const, hors c'est précisement ce qu'attends la fonction non membre qui sera appelé , une référence non const à un objet de type ofstream.

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

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. les rvalue reference
    Par yan dans le forum C++
    Réponses: 15
    Dernier message: 15/05/2008, 16h45

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