Conceptuellement et pratique, quelle est la bonne façon de retourner la valeur modifiée d'une fonction que potentiellement prend une référence de valeur r.Quel est le retour correct dans une fonction qui modifie une référence de valeur r potentielle?
template<class Vector>
??? add_element(Vector&& v){
v.emplace_back(1.);
return ???(v);
}
Intuition me dit cela, (parce que je ne lâche l'information du type d'origine)
template<class Vector>
Vector&& add_element(Vector&& v){
v.emplace_back(1.);
return std::forward<Vector>(v);
}
mais parmi d'autres possibilités est
template<class Vector>
Vector& add_element(Vector&& v){
v.emplace_back(1.);
return v;
}
ou même ceux-ci, (basé sur ce https://pizer.wordpress.com/2009/04/13/c0x-do-people-understand-rvalue-references/)
template<class Vector>
Vector // or typename std::decay<Vector>::type
add_element(Vector&& v){
v.emplace_back(1.);
return v; // or std::forward<Vector>(v);
}
Quelle est la manière la plus générique de retourner l'argument passé modifié?
Si je comprends bien, même si l'argument n'est pas un conteneur, la première option est le cas qui donne la performance sans compromis et la généralité. non? – alfC
@alfC Si vous avez des objets coûteux à déplacer, il est clair que ce n'est pas une performance sans compromis. Tous les conteneurs 'std' mutables en longueur sont peu coûteux à copier, ce qui ne s'applique pas ici. – Yakk
également "ne jamais retourner un conteneur par référence rvalue.": Comme contre-exemple, 'std :: optionnel :: operator *()' ou 'std :: optionnel :: value()' _do_ renvoie par référence rvalue. –