consideri il seguente esempio:È legale spostare il membro .str() di uno stringstream?
#include <sstream>
template <typename T>
inline std::string to_string(T const & op) {
std::ostringstream result;
result << op;
return result.str();
}
Se dovessi ritornare risultato, invece di result.str() sarebbe diventato automaticamente un rvalue. Non così la stringa contenuta nel risultato (presumo). La mia aspettativa è che sia copiato e la copia restituita come valore.
Quindi la mia domanda è qui, è legale:
return std::move(result.str());
Vorrei assumere è, aspettandosi il flusso di essere lasciato con una stringa vuota valida. Ma non mi sento abbastanza sicuro per farlo davvero.
La chiamata 'std :: move (e)' in un'istruzione return è un anti-pattern. L'espressione restituita è implicitamente trattata come un valore rval e comunque usando 'std :: move' inibisce copy-elision. – TartanLlama
@TartanLlama non stai semplificando eccessivamente? Cosa accadrebbe se ci fosse una funzione "std :: string std :: ostringstream :: str() &&", non sarebbe il modo migliore per lasciare la funzione a "return std :: move (result) .str();"? – kamikaze
@kamikaze Sì, come Baum dice che mi riferivo al modello in cui tutto ciò che hai nella dichiarazione di ritorno è 'std :: move (e)', dove 'e' è una espressione. – TartanLlama