Рассмотрим следующий код: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
- новый вектор построенный из
container
путем перемещения container
получает уничтожены
После возвращения функции:
tmp
строится конструктор копирования
Мой вопрос, почему не tmp
, построенный конструктором перемещения?
Как я понимаю, функция возврата функции имеет значение rvalue и должна быть перемещена.
возможно дубликат [C++ 11 оптимизации Возвращаемое значение или двигаться?] (Http://stackoverflow.com/questions/17473753/c11-return-value-optimization-or-move) –
Хмм g ++ и clang ++ (libstdC++ и libC++) * do * переместите 'vector': http://coliru.stacked-crooked.com/a/27aacf34fc3e22b3, в то время как VS2013 копирует его: http://rextester.com/JEXDDD72242 – dyp
VS2013 также перемещается вектор при вызове оператора преобразования явно: http://rextester.com/SSMH48781 – dyp