par exemple:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
par exemple:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
Cette fonction retourne une balançant de référence, tout comme avec la lvalue cas de référence. Après les retours de fonction, l'objet temporaire obtiendrez été détruits. Vous devez retourner Beta_ab
en valeur, comme suit
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
Maintenant, c'est le déplacement temporaire Beta_ab
objet dans la valeur de retour de la fonction. Si le compilateur ne peut pas, il va éviter de le déplacer au total, en utilisant RVO (valeur de retour d'optimisation). Maintenant, vous pouvez effectuer les opérations suivantes
Beta_ab ab = others.toAB();
Et il se déplace construire temporaire en ab
, ou ne RVO d'omettre de faire un copier ou déplacer tout à fait. Je vous recommande de lire BoostCon09 Références Rvalue 101 ce qui explique l'importance et la manière dont (N)RVO arrive à interagir avec ce.
Votre cas de retour de référence rvalue serait une bonne idée dans d'autres occasions. Imaginez que vous avez un getAB()
fonction qui vous invoque souvent temporaire. Il n'est pas optimale pour le faire revenir const lvalue référence rvalue temporaires. Vous pouvez l'appliquer comme ceci
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
Notez que move
dans ce cas n'est pas une option, car ab
n'est ni un local automatique ni temporaire rvalue. Maintenant, le ref-qualificatif &&
affirme que la seconde fonction est appelée sur rvalue temporaires, faire le mouvement suivant, au lieu de copier les
Beta_ab ab = Beta().getAB();
Il permet un retour temporaire directement, sans avoir à le copier. Ce qui signifie que, oui, il sera plus rapide que la copie temporaire et le retour de la copie.
Il ne fait pas de sens pour lui demander si elle est "plus efficace". Plus efficace que quoi? Ne pas avoir à faire une copie est certainement plus rapide que d'avoir à faire une copie, mais parfois, vous avez peut-être pu éviter l'appel de la fonction tout à fait, et qui aurait été plus efficace. Parfois, vous pourriez avoir à faire la copie de toute façon, et puis il ne fera pas une différence.
L'une des principales raisons pour lesquelles les références rvalue ont été ajoutés est la performance. Donc oui, il peut éventuellement améliorer les performances. Si vous l'utilisez dans un contexte où il fait sens.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.