为什么unique_ptr将deleter作为types参数,而shared_ptr则没有?
std::unique_ptr
模板有两个参数:指针的types和删除器的types。 这第二个参数有一个默认值,所以你通常只是写一些像std::unique_ptr<int>
。
std::shared_ptr
模板只有一个参数:指针的types。 但是,即使删除types不在类模板中,也可以使用此自定义删除程序。 通常的实现使用types擦除技术来做到这一点。
是否有同样的想法没有用于std::unique_ptr
?
其中一部分原因是shared_ptr
无论如何都需要一个明确的控制块来处理裁减计数,并且坚持一个删除器并不是什么大事。 然而unique_ptr
不需要任何额外的开销,并且添加它将是不受欢迎的 – 它应该是一个零开销类。 unique_ptr
应该是静态的。
如果你想要这样的行为,你总是可以在上面添加自己的types擦除,例如,你可以使用unique_ptr<T, std::function<void(T*)>>
,这是我过去做的事情。
除了DeadMG指出的另外一个原因,就是写作是可能的
std::unique_ptr<int[]> a(new int[100]);
和~unique_ptr
将调用正确版本的delete
(通过default_delete<_Tp[]>
),这要归功于T
和T[]
专门化。