Рассмотрим этот простой класс
class Foo
{
public:
Foo() = default;
Foo(const Foo &) = default;
Foo & operator=(const Foo & rhs)
{
return *this;
}
Foo & operator=(Foo && rhs) = delete;
};
Foo getFoo()
{
Foo f;
return f;
}
int main()
{
Foo f;
Foo & rf = f;
rf = getFoo(); // Use of deleted move assignment.
return 0;
}
Когда я скомпилирую пример выше, я получаю error: use of deleted function 'Foo& Foo::operator=(Foo&&)'
Если предусмотрено только назначение копирования, все категории аргументов выбирают его (если он принимает свой аргумент по значению или как ссылку на константу, так как rvalues могут связываться с ссылками на const), что делает назначение копии резервом для назначения переноса, когда перемещение недоступно.
Почему резервное копирование компилятора не копирует назначение, если ссылка const lvalue может связываться с rvalue и const Foo & f = getFoo();
работает.
Компилятор - gcc 4.7.2.