为什么unique_ptr不能推断出删除器的类型?

时间:2015-04-15 20:35:56

标签: c++ c++11 unique-ptr

我想说我想使用带有unique_ptr的自定义删除器:

void custom_deleter(int* obj)
{
    delete obj; 
}

为什么我要写这个:

std::unique_ptr<int, void(*)(int*)> x(new int, custom_deleter);

而不是:

std::unique_ptr<int> x(new int, custom_deleter); //does not compile

可以推断出删除器的类型吗?

2 个答案:

答案 0 :(得分:6)

对于unique_ptr,删除器是类型的一部分:

template <
    class T,
    class Deleter = std::default_delete<T>
> class unique_ptr;

因此,当您构建对象时,需要指定其类型。您正在撰写的专栏:

std::unique_ptr<int> x(new int, custom_deleter);

相当于:

std::unique_ptr<int, std::default_delete<int> > x(new int, custom_deleter);

您无法从std::default_delete<int>构建custom_deleter

推断删除类型的唯一方法是在该部分使用模板推理:

template <typename T, typename Deleter>
std::unique_ptr<T, Deleter> make_unique_ptr(T* ptr, Deleter deleter) {
    return std::unique_ptr<T, Deleter>(ptr, deleter);
}

答案 1 :(得分:3)

它无法推断删除器的类型,因为默认情况下unique_ptr没有专门用于删除器的状态:默认删除器是无状态的。

在你的情况下,删除者需要一个指针的状态,所以它不适合&#39;在std::unique_ptr的状态(这只是指向T的指针)。

这使得unique_ptr成为拥有指针的轻量级,几乎无成本的替代品。

可以完成Deductin,但必须更改结果unique_ptr的类型。

相比之下,shared_ptr总是具有删除器的状态容量,两个不同的原子计数器和一个指向值的指针。它的重量更重,而且不是指针的免费替代品。