Переместить конструктор при возврате "связанного" объекта
Скажем, у меня есть класс, который предназначен только для перемещения, и у этого класса есть методы, которые "цепляются". пример:
struct C {
C() = default;
C(C const&) = delete;
C(C&&) = default;
C& chained() {
return *this;
}
int a;
};
C foo(C c) {
return c.chained();
}
int main()
{
auto o = foo(C{});
}
Я получаю сообщение об ошибке в операторе возврата foo: "Использование удаленной функции" C::C(const C&) "".
Почему пытается вызвать конструктор копирования? Разве он не должен использовать конструктор перемещения, так как это оператор return?
1 ответ
Почему пытается вызвать конструктор копирования? Разве он не должен использовать конструктор перемещения, так как это оператор return?
Нет. Вы имеете в виду и неверно истолковываете копию разрешения (относящегося к NRVO). Только когда возвращенное выражение является id-выражением (просто именем), которое ссылается на объект из списка параметров функции или локальное, сначала будет предпринята попытка перемещения.
Вы не возвращаете id-выражение, ваше выражение является результатом вызова функции-члена.