std::unique_ptr
模板有两个参数:指针对象的类型和删除器的类型。第二个参数有一个默认值,因此您通常只需编写类似std::unique_ptr<int>
的内容。
std::shared_ptr
模板只有一个参数:指针对象的类型。但是你也可以使用自定义删除器,即使删除类型不在类模板中。通常的实现使用类型擦除技术来做到这一点。
是否有理由不对std::unique_ptr
使用相同的想法?
答案 0 :(得分:37)
部分原因是shared_ptr
无论如何都需要一个明确的控制块来进行引用计数,并且保留一个删除器并不是最重要的。 unique_ptr
然而不需要任何额外的开销,并且添加它将是不受欢迎的 - 它应该是零开销类。 unique_ptr
应该是静态的。
如果您想要这样的行为,您可以随时添加自己的类型擦除 - 例如,您可以拥有unique_ptr<T, std::function<void(T*)>>
,这是我过去所做的事情。
答案 1 :(得分:2)
另一个原因,除了DeadMG指出的那个,就是可以写
std::unique_ptr<int[]> a(new int[100]);
由于专注于~unique_ptr
和{{1},和delete
会调用default_delete<_Tp[]>
的正确的版本(通过T
) }。