• [^] # Re: Intéressant

    Posté par (site web personnel) . En réponse à la dépêche Je crée mon jeu vidéo E09 : Techniques de C++11 appliquées au système à entités. Évalué à 2.

    Tu auras le droit à un beau message d'erreur du compilateur (l'argument n'est pas un Lvalue-reference)

    Comme dit zu, tu n'aura pas d'erreur. Ça passe très bien, et sans copie

    Sinon, la grande question est: faut il passer par valeur ou par référence?

    imagine un setteur qui en C++03 ressemble à ça:

    Contact::setIdentity(const string &firstname, const string &lastname, const string &address) {
     m_first = firstname; 
     m_last = lastname;
     if (m_careAboutAddress) 
     m_address = address;
    }

    Tu ne va pas te taper 6 variantes avec toutes les possibilité de rvalue ou value. Ce que tu fais c'est:

    Contact::setIdentity(string firstname,string lastname,string address) {
     m_first = move(firstname); 
     m_last = move(lastname);
     if (m_careAboutAddress) 
     m_address = move(address);
    }

    Comme ça, dans le meilleur des cas, il n'y a plus de copie (que des move), quand l'apellant peux faire des moves. Et dans le pire des cas, il n'y a toujours que 3 copies (comme avant). La différence c'est que ces 3 copies sont faite par l'appelant. (Ce qui a l'inconvénient de générer plus de code car chaque appelant doit faire les copie alors que avant les copies étaient mutualisées dans la fonction).

    Mais ce n'est toujours pas parfait, car si m_careAboutAddress est false, il n'y avait que 2 copies dans le pire des cas avant, alors que maintenant il y 3 copies dans le pire des cas. Bref, il n'y a pas de solution magique :-(