И unique_ptr
, и shared_ptr
принимают пользовательский деструктор для вызова объекта, которому они принадлежат. Но в случае с деструктор передается в качестве параметра шаблона класса , тогда как тип настраиваемого деструктора shared_ptr
должен быть указан как шаблонный шаблон конструктор.Почему unique_ptr принимает два параметра шаблона, когда shared_ptr принимает только один?
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
и
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
Я не могу понять, почему такая разница. Что требует этого?
Я думаю, что причина в том, что как unique_ptr может только построен один раз на один «человека» в то время как shared_ptr могут быть использованы и розданы по всей программе и, следовательно, быть построены с разными аргументами. – Paranaix
Тип 'shared_ptr' - стирает делектор, то есть пользователи' shared_ptr' не должны знать, какой тип имеет делектор. Это имеет временную стоимость (выделение, разыменование), поэтому она не выполняется для 'unique_ptr' (которая является бесплатной). Например. см. http://stackoverflow.com/q/6324694/420683 – dyp
@ dyp: Может быть, это расширит это в ответ, включая краткое руководство по стиранию стилей? Хотя он не отвечает _why_, тот же подход не был выбран для 'unique_ptr' ... Разве это? – Nemo