Неявно ли перемещаются параметры значений, когда они возвращаются по значению?

Рассмотрим следующую функцию:

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 ++ ' соответствует ли поведение?

22
задан fredoverflow 15 May 2011 в 14:30
поделиться