Почему уникальный ptr имеет deleter в качестве параметра типа, а общий ptr-нет?
The std::unique_ptr
шаблон имеет два параметра: тип указателя и тип делетера. Этот второй параметр имеет значение по умолчанию, поэтому обычно просто пишут что-то вроде std::unique_ptr<int>
.
The std::shared_ptr
шаблон имеет только один параметр, хотя: тип указателя. Но вы также можете использовать пользовательский делетер с этим, даже если тип делетера не находится в шаблоне класса. Обычная реализация использует методы стирания типа для сделать это.
Почему же идея не была использована для std::unique_ptr
?
2 ответа:
часть причины в том, что
shared_ptr
нужен явный блок управления в любом случае для счетчика ref и вставлять делетер в это не так уж и важно сверху.unique_ptr
однако не требует никаких дополнительных накладных расходов, и добавление его было бы непопулярным - это должен быть класс с нулевыми накладными расходами.unique_ptr
должен быть статичным.вы всегда можете добавить свой собственный тип стирания сверху, если вы хотите, чтобы такое поведение - например, вы можете иметь
unique_ptr<T, std::function<void(T*)>>
, то, что я сделал в прошлое.