Рассмотрим тип T, поддерживающий семантику перемещения по умолчанию. Также рассмотрите функцию ниже:
T f() {
T t;
return t;
}
T o = f();
В старом С++ 03 некоторые неоптимальные компиляторы могут дважды вызвать конструктор копирования, один для "возвращаемого объекта" и один для o
.
В С++ 11, поскольку t
внутри f()
является lvalue, эти компиляторы могут вызвать конструктор копирования как можно раньше, а затем вызвать конструктор перемещения для o.
Правильно ли утверждать, что единственный способ избежать первой "дополнительной копии" - переместить t
при возврате?
T f() {
T t;
return std::move(t);
}