Рассмотрим следующую функцию:
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 ++ или нет?