2015-06-23 7 views
8

Рассмотрим следующий код:C++ 11 перемещения семантика и Rvalue ссылки

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; 
    } 
}; 

Это использование:

vector<string> tmp = StringTokenizer("123 456", ' '); //Please note the implicit conversion 

При отладке происходит следующее (с помощью VS2013):

В операторе преобразования return

  1. новый вектор построенный из container путем перемещения
  2. container получает уничтожены

После возвращения функции:

  1. tmp строится конструктор копирования

Мой вопрос, почему не tmp, построенный конструктором перемещения?

Как я понимаю, функция возврата функции имеет значение rvalue и должна быть перемещена.

+1

возможно дубликат [C++ 11 оптимизации Возвращаемое значение или двигаться?] (Http://stackoverflow.com/questions/17473753/c11-return-value-optimization-or-move) –

+2

Хмм g ++ и clang ++ (libstdC++ и libC++) * do * переместите 'vector': http://coliru.stacked-crooked.com/a/27aacf34fc3e22b3, в то время как VS2013 копирует его: http://rextester.com/JEXDDD72242 – dyp

+0

VS2013 также перемещается вектор при вызове оператора преобразования явно: http://rextester.com/SSMH48781 – dyp

ответ

Смежные вопросы