为什么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[]> ),这要归功于TT[]专门化。