Вернуть локальное значение из функции без запуска конструктора копирования
Я пытаюсь удалить конструктор копирования, используя систему типов 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
без запуска копирования конструкции?
Пусть компилятор позаботится об этом.