Рассмотрим следующую функцию:
Foo foo(Foo x)
{
return x;
}
Будет ли возвращать 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 ++ ' соответствует ли поведение?