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 :

Modification de valeur à droite


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Modification de valeur à droite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    std::string make_string()
    {
    	return "abc";
    }
     
    int make_int()
    {
    	return 5;
    }
     
    int main()
    {
    	make_string() = "xyz";
    	make_int() = 8; // error C2106: '=': left operand must be l-value
    	return 0;
    }
    Assez curieusement, modifier un std::string à "droite" est permis mais pas un int.
    Il y a certainement une bonne raison dans l'apparente incohérence dans ce traitement permissif dans le cas du std::string (et de toute autre classe d'ailleurs) mais pas des types primitifs.
    Et je me demande bien laquelle.
    (c'est vraiment pas important, c'est juste que je trouve ça curieux )

  2. #2
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Une litteral String, c'est un array = lvalue.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    "abc" : est bien une const l-value;
    std::string("abc") : est par contre une r-value.

    Ça semble du pur bon sens d'interdire d'écrire dans une l-value pour les types scalaires, d'où le refus.
    Depuis C++11 (ou C++14?) on peut forcer une fonction membre à être accessible en distinguant l-value de r-value. Peut-être qu'un certain nombre d'opérateurs de copie auraient pu être adaptés car cela à peu de sens. Je pense que c'est pour conserver la compatibilité dans de rares cas que les objets de la STL n'ont pas été adaptés.

    std::cout << (std::string() = "abc") << std:endl; est donc accessible.
    En tout cas je ne vois pas d'exemple avec std::string pour justifier la possibilité d'un operateur= sur une r-value.

    On peut tout à faire écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Toto {
        Toto& operator=( Toto const& t )&   {   // autorisé sur l-value seulement
            return *this;
        }
    };
     
    int main()
    {
    	Toto() = Toto();   // ne compile pas : Toto() n'est pas une l-value
    }

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Ok, si je comprends bien les types primitifs refusent de modifier leur valeur à droite (rvalue). Ce qui me semble très bien.

    Pour les autres, c'est simplement parce que le ref-qualifier n'a pas été explicitement placé, en l'occurence pour l'operator=() de std::string dans le cas qui nous occupe.

    Merci

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2016
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 54
    Par défaut
    Citation Envoyé par camboui Voir le message
    Ok, si je comprends bien les types primitifs refusent de modifier leur valeur à droite (rvalue). Ce qui me semble très bien.:
    Contrairement à une lvalue, une rvalue c'est simplement une valeur. Pas d'adresse définie et pas de moyen d'y accéder donc.

  6. #6
    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
    Ton code d'exemple a peu d’intérêt en effet, mais que penserais-tu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    auto unixPath = makeString().replace_all("\\", "/");
    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.

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

Discussions similaires

  1. tables liées SQL et droit de modif des valeurs
    Par moby38 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 04/06/2008, 08h51
  2. Modifer une valeur dans un panier sans la valider
    Par budiste dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/03/2006, 09h53
  3. [VB6]Modification de valeurs dans une MSflexgrid
    Par Tyrael62 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 14/02/2006, 08h48
  4. [C#] Datagrid et modification de valeur
    Par Kaïn dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/01/2006, 11h48
  5. Selectionner la troisieme valeur à droite d'1 référence
    Par beurnoir dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/01/2006, 15h56

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