Посмотрите на этот код:
class Foo
{
public:
string name;
Foo(string n) : name{n}
{
cout << "CTOR (" << name << ")" << endl;
}
Foo(Foo&& moved)
{
cout << "MOVE CTOR (moving " << moved.name << " into -> " << name << ")" << endl;
name = moved.name + " ###";
}
~Foo()
{
cout << "DTOR of " << name << endl;
}
};
Foo f()
{
return Foo("Hello");
}
int main()
{
Foo myObject = f();
cout << endl << endl;
cout << "NOW myObject IS EQUAL TO: " << myObject.name;
cout << endl << endl;
return 0;
}
Вывод:
[1] CTOR (Hello)
[2] MOVE CTOR (перемещение Hello в → )
[3] DTOR Hello
[4] MOVE CTOR (перемещение Hello ### в - > )
[5] DTOR Hello ###
[6] СЕЙЧАС ДВА ЕСТЬ РАВНО: Здравствуйте, ### ###
[7] DTOR Hello ### ###
Важное примечание.. Я отключил оптимизацию исключения копий с помощью -fno-elide-constructors
для целей тестирования.
Функция f() создает временную [1] и возвращает ее, вызывающую конструктор перемещения, чтобы "переместить" ресурсы из этого временного объекта в myObject [2] ( кроме того, он добавляет 3 символа).
В конце концов временное разрушено [3].
Теперь я ожидаю, что myObject будет полностью сконструирован, а его атрибут name будет Hello ###.
Вместо этого конструктор перемещения вызывается AGAIN, поэтому я остался с Hello ### ###