Рассмотрим следующую функцию:
Foo foo(Foo x)
{
return x;
}
Будет ли return x
вызывать конструктор копирования или конструктор перемещения? (Оставьте NRVO в стороне отсюда.)
Чтобы исследовать, я написал простой класс Foo
, который является только подвижным, но не копируемым:
struct Foo
{
Foo() = default;
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
};
Если конструктор перемещения был вызван при возврате значений параметров по значению, все должно быть хорошо. Но текущий компилятор g++ жалуется на return x
со следующим сообщением об ошибке:
error: deleted function 'Foo::Foo(const Foo&)'
Если заменить return x
на return std::move(x)
, все будет хорошо. Из этого я заключаю, что переход от значений параметров должен выполняться явно, если это необходимо. Соответствует ли поведение g++ или нет?