为什么unique_ptr只有在shared_ptr只有一个参数的时候才需要两个模板参数呢?

unique_ptrshared_ptr接受一个自定义析构函数来调用它们自己拥有的对象。 但是在unique_ptr的情况下,析构函数作为类的模板parameter passing,而shared_ptr的自定义析构函数的types被指定为构造函数的模板参数。

 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 ),则它是该types的一部分,并且不需要在此types的对象中unique_ptr任何其他内容。 如果deleter作为构造函数的parameter passing(如在shared_ptr ),则需要将其存储在对象中。 这是额外灵活性的代价,因为您可以为同一types的对象使用不同的删除器。

我想这是原因: unique_ptr应该是非常轻量级的对象,零开销。 使用每个unique_ptr存储删除者可能会使其大小加倍。 因为人们会使用旧的原始指针,这将是错误的。

另一方面, shared_ptr并不是轻量级的,因为它需要存储引用计数,所以存储自定义的删除器看起来也不错。