为什么unique_ptr只有在shared_ptr只有一个参数的时候才需要两个模板参数呢?
unique_ptr
和shared_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
并不是轻量级的,因为它需要存储引用计数,所以存储自定义的删除器看起来也不错。