Dupliqué possible: strong>
est une valeur de passage raisonnable à C ++ 11 ? p>Je lis je lis Violez-vous? Passer par la valeur. par Dave Abrahams sur Copy Elision et RVO. Et je me demande pourquoi avons-nous besoin de la copie élision? P>
On m'a dit trop de fois que vous devriez passer des arguments de fonction par const Référence pour éviter la copie (presque tous les livres de C ++ que je lisai de cela ). P>
Supposons que nous ayons deux fonctions: p>
xxx pré> si l'argument réel est une r devalue, la copie sera évitée dans les deux fonctions. Mais si l'argument réel est un lvalue, la copie ne sera évitée que dans F1, pas en F2. Alors, pourquoi avons-nous besoin de cette fonctionnalité? P> BlockQuote>
3 Réponses :
passe de valeur si vous avez besoin d'une copie quand même. Que vous choisissiez la signature de F1 ou la signature de F2 dépend du contenu de la fonction. Par exemple, vous utiliseriez une référence de const dans ce cas: mais vous passeriez par valeur dans ce cas: p> car L'alternative serait la suivante: p>
Une note: Ce dernier cas se produit souvent dans les constructeurs. Donné structure s {s (...): s (s) {} std :: string s; }; code>, alors il est préférable d'utiliser
std :: string s code> à la place de
... code> plutôt qu'un
std :: string const & s < / code> car il y aura une copie quand même.
@Matthieum: Mais assurez-vous de le déplacer dans le membre, ne le copiez pas. I.e. s (std :: string s): s (std :: déplace (s)) {} code>
RVO ne s'applique pas à votre exemple car la valeur de retour est Tally: 1-2 copies en C ++ 03, exactement 1 Dans C ++ 11 plus (si élision est désactivé), un geste qui peut dégénérer à une copie pour une autre classe que Comme d'autres personnes ont dit, passez par valeur lorsque vous souhaitez manipuler l'objet comme une valeur pure. , sans aucune sémantique de référence. p> int code>.
std :: string code>. p>
const & code> est un idiome familier, mais c'est un peu d'un kilométrie en termes de sémantique du langage. Vous l'utilisez lorsque vous ne voulez pas une référence du tout; Le
& code> sert simplement à créer le
const code> significatif dans la définition de paramètre. Si vous souhaitez modifier le paramètre (mais uniquement localement),
const code> ne s'applique pas vraiment, ainsi que le
& code> goutte également. P> p> p >
F2 code> signaux par sa signature, peu importe ce que vous passez à moi, je traiterai de ma propre copie de votre objet. Utile, si
F2 code> va modifier l'objet de manière non réversible (par exemple, il s'agit de ressources en déménagement) ou dans certains scénarios de concurrence. Certes, C ++ 11 ajoute un nouveau niveau de confusion au système de type C ++ (déjà déroutant), mais une fois que vous y réfléchissez, il a beaucoup de sens ... P>