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

rub*_*ict 11 c++ unique-ptr c++11

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

void custom_deleter(int* obj)
{
    delete obj; 
}
Run Code Online (Sandbox Code Playgroud)

为什么我要写这个:

std::unique_ptr<int, void(*)(int*)> x(new int, custom_deleter);
Run Code Online (Sandbox Code Playgroud)

而不是这个:

std::unique_ptr<int> x(new int, custom_deleter); //does not compile
Run Code Online (Sandbox Code Playgroud)

不能推断出删除器的类型吗?

Bar*_*rry 6

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

template <
    class T,
    class Deleter = std::default_delete<T>
> class unique_ptr;
Run Code Online (Sandbox Code Playgroud)

因此,在构建对象时,需要指定其类型.你写的这行:

std::unique_ptr<int> x(new int, custom_deleter);
Run Code Online (Sandbox Code Playgroud)

相当于:

std::unique_ptr<int, std::default_delete<int> > x(new int, custom_deleter);
Run Code Online (Sandbox Code Playgroud)

你不能建立一个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);
}
Run Code Online (Sandbox Code Playgroud)

  • @vsoftco [从上面复制]如何工作?它必须采用一个参数包来构造T.你如何区分哪一个Args ...是Deleter? (2认同)