Prenons l'exemple suivant:Est-il légal de déplacer le membre .str() d'un stringstream?
#include <sstream>
template <typename T>
inline std::string to_string(T const & op) {
std::ostringstream result;
result << op;
return result.str();
}
Si je devais retourner résultat, au lieu de result.str() il deviendrait automatiquement un rvalue. Pas si la chaîne contenue dans le résultat (je suppose). Mon attente est qu'il est copié et la copie retournée comme une valeur.
Donc, ma question est ici, est-il légal de:
return std::move(result.str());
Je suppose qu'il est, en attendant le flux à gauche avec un valide, une chaîne vide. Mais je ne me sens pas assez certain pour le faire.
L'appel de 'std :: move (e)' dans une instruction return est un anti-pattern. L'expression retournée est implicitement traitée comme un rvalue de toute façon et l'utilisation de 'std :: move' inhibe l'élision de la copie. – TartanLlama
@TartanLlama ne simplifiez-vous pas? Que se passerait-il s'il y avait une fonction "std :: string std :: ostringstream :: str() &&", ne serait pas le meilleur moyen de quitter la fonction "return std :: move (result) .str();" – kamikaze
@kamikaze Oui, comme Baum dit que je faisais référence au modèle où tout ce que vous avez dans votre déclaration de retour est 'std :: move (e)', où 'e' est une expression. – TartanLlama