Por que unique_ptr usa dois parâmetros de modelo quando shared_ptr usa apenas um?

Ambosunique_ptr eshared_ptr aceite um destruidor personalizado para chamar o objeto que eles possuem. Mas no caso deunique_ptr, o destruidor é passado como um parâmetro de modelo doclasse, enquanto o tipo deshared_ptrO destruidor personalizado de deve ser especificado como um parâmetro de modelo doconstrutor.

template <class T, class D = default_delete<T>> 
class unique_ptr
{
    unique_ptr(T*, D&); //simplified
    ...
};

e

template<class T>
class shared_ptr
{
    template<typename D>
    shared_ptr(T*, D); //simplified
    ...
};

Não vejo por que tanta diferença. O que requer isso?

questionAnswers(2)

yourAnswerToTheQuestion