Возможный дубликат:
Что произойдет, если я верну литерал вместо объявленного std::string?
Рассмотрим следующий код
string getName () {
return "meme";
}
string name = getName();
Функция getName()
возвращает временный объект. Я понимаю, что в С++ 03 вызывается конструктор копирования string
и временный объект уничтожается. На самом деле кажется, что компилятор (по крайней мере в GCC 4.7) оптимизирует строку 5, не создавая объект name
, а заменяя его самим временным объектом и не уничтожая временный объект. (Я пытался использовать класс MyVector
, а не std::string)
Как определено в стандартах С++ 11,
getName()
возвращает значение?В строке 5 выше, какой конструктор строки вызывается (перемещение или копирование)? Должен ли я обязательно вызывать
std::move()
для вызова конструктора перемещения?С семантикой перемещения она менее эффективна, чем оптимизация "копирования", предоставляемая компилятором?