consideri il seguente codice rvalue:C++ 11 semantica circolare e di riferimento
class StringTokenizer
{
private:
char m_delimiter;
std::istringstream m_string;
public:
explicit StringTokenizer(const std::string& str, char delimiter)
: m_string(str)
, m_delimiter(delimiter)
{
}
template <class Container>
operator Container()
{
Container container;
for (std::string token; std::getline(m_string, token, m_delimiter);)
{
container.insert(container.end(), token);
}
return container;
}
};
Questo è l'utilizzo:
vector<string> tmp = StringTokenizer("123 456", ' '); //Please note the implicit conversion
Quando il debug avviene quanto segue (Uso VS2013):
All'operatore di prospetto di conversione return
- nuovo vettore costruito
container
spostando container
viene distrutto
Dopo il ritorno funzione:
tmp
è costruito dal costruttore di copia
mia domanda è perché non è tmp
costruito da costruttore di movimento?
Come ho capito le cose funzione tipo restituito è valore e deve essere spostato.
possibile duplicato del [C++ 11 ottimizzazione del valore di ritorno o spostare?] (Http://stackoverflow.com/questions/17473753/c11-return-value-optimization-or-move) –
Hmm g ++ e clang ++ (libstdC++ e libC++) * do * spostano il 'vector': http://coliru.stacked-crooked.com/a/27aacf34fc3e22b3 mentre VS2013 lo copia: http://rextester.com/JEXDDD72242 – dyp
VS2013 si muove anche il vettore quando si chiama esplicitamente l'operatore di conversione: http://rextester.com/SSMH48781 – dyp