Переместить конструктор при возврате "связанного" объекта

Скажем, у меня есть класс, который предназначен только для перемещения, и у этого класса есть методы, которые "цепляются". пример:

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-выражение, ваше выражение является результатом вызова функции-члена.

Другие вопросы по тегам