Вернуть локальное значение из функции без запуска конструктора копирования

Я пытаюсь удалить конструктор копирования, используя систему типов C++, чтобы предотвратить копирование объекта.

struct DeleteCopyConstructor {
    DeleteCopyConstructor() {};
    DeleteCopyConstructor(DeleteCopyConstructor& op2) = delete;
    DeleteCopyConstructor(const DeleteCopyConstructor& op2) = delete;
};

DeleteCopyConstructor f() {
    DeleteCopyConstructor d;
    // initialize d...
    return d;
}

Ошибка:

error: use of deleted function ‘DeleteCopyConstructor::DeleteCopyConstructor(const DeleteCopyConstructor&)’

Я читал о разрешении копирования, но это похоже на оптимизацию компилятора, поэтому я не думаю, что это применимо. Как я могу вернуться d без запуска копирования конструкции?

2 ответа

В C++17 компилятор гарантированно удаляет копию. Однако во всех случаях вам все еще нужно иметь действительный конструктор копирования.

Так что, если вы просто беспокоитесь о производительности, вам не нужно ничего делать. Если вы хотите удалить конструктор копирования, потому что значение логически не должно быть копируемым, то, насколько я знаю, сделать это невозможно. Вы должны вернуть std::unique_ptr<T> или взять значение по ссылке и перейти к нему таким образом. Редактировать: Или определить конструктор перемещения.

Скопируйте elision, но это похоже на оптимизацию компилятора, поэтому я не думаю, что это применимо.

Оно делает. Подробнее читайте в разделе Оптимизация перемещения или именованного возвращаемого значения (NRVO)?

Как я могу вернуться d без запуска копирования конструкции?

Пусть компилятор позаботится об этом.

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