Краткое вступление:
unique_ptr может привести к небольшим издержкам, но не из-за удаления, а потому, что когда вы переходите от него, значение должно быть установлено на ноль, где, если вы используете необработанные указатели, вы можете оставить старый указатель в склонный к ошибкам, но законный штат, где он все еще указывает туда, куда указывал ранее. Очевидно, умный оптимизатор может оптимизировать, но это не гарантируется.
Вернуться к удалению:
Другие ответы правильные, но сложные. Итак, вот упрощенная версия без упоминания EBO или других сложных терминов.
Если средство удаления пустое (не имеет состояния), вам не нужно хранить его внутри unique_ptr. Если вам это нужно, вы можете просто построить его, когда вам это нужно. Все, что вам нужно знать, это тип удалителя (и это один из аргументов шаблона для unique_ptr).
Для примера рассмотрим следующий код, который также демонстрирует простое создание по запросу объекта без состояния.
#include <iostream>
#include <string>
#include <string_view>
template<typename Person>
struct Greeter{
void greet(){
static_assert(std::is_empty_v<Person>, "Person must be stateless");
Person p; // Stateless Person instance constructed on demand
std::cout << "Hello " << p() << std::endl;
}
// ... and not kept as a member.
};
struct Bjarne{
std::string_view operator()(){
return "Bjarne";
}
};
int main() {
Greeter<Bjarne> hello_bjarne;
hello_bjarne.greet();
}