2015-06-23 11 views
8

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

  1. nuovo vettore costruito container spostando
  2. container viene distrutto

Dopo il ritorno funzione:

  1. 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.

+1

possibile duplicato del [C++ 11 ottimizzazione del valore di ritorno o spostare?] (Http://stackoverflow.com/questions/17473753/c11-return-value-optimization-or-move) –

+2

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

+0

VS2013 si muove anche il vettore quando si chiama esplicitamente l'operatore di conversione: http://rextester.com/SSMH48781 – dyp

risposta

Problemi correlati