Почему компилятор пытается скопировать вместо перемещения возвращаемого значения?

58
7

Мой код выглядит так:

// definition of class 'Foo'
class Foo
{
private:
vector<Bar> v;
public:
...
Foo(Foo&&) = default; // move constructor
};

// definition of function 'f'
Foo f()
{
Foo x;
DoStuff(x);
return x;
}

// Somewhere in main
result = f(); // I am aiming to move 'x' to 'result'

Когда я пытаюсь скомпилировать, я получаю

EAL_1.6.cpp:314:13: error: object of type 'Foo' cannot be assigned because its copy assignment operator is implicitly deleted
x = f(x);
^
EAL_1.6.cpp:232:5: note: copy assignment operator is implicitly deleted because 'Foo' has a user-declared move constructor
Foo(Foo&&) = default;
^

У меня возникло соблазн попробовать

return move(x);

но это не похоже на умное решение в соответствии с этим постом. Я понимаю, что конструктор кода удаляется при определении конструктора перемещения (как объясняется в этом сообщении), но я не понимаю, как сообщить компилятору, что я хотел бы, чтобы "х" был перенесен в "результат".

спросил(а) 2016-11-02T22:22:00+03:00 3 года, 11 месяцев назад
1
Решение
114

Эта:

result = f(); // I am aiming to move 'x' to 'result'

это не попытка перемещения, это попытка переноса задания. И, как компилятор говорит вам:

объект типа Foo не может быть назначен, поскольку его оператор назначения копирования неявно удален

Оператор присваивания копий неявно удаляется (и оператор присваивания перемещения просто отсутствует полностью), потому что вы добавили конструктор перемещения. Предположительно, если ваш тип движется конструктивно, он также переносится присваиваемым. Так что просто добавьте:

Foo& operator=(Foo&& ) = default;

ответил(а) 2016-11-02T22:25:00+03:00 3 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема