c++ - 为什么 unique_ptr 不能推断删除器的类型?

标签 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

?

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

最佳答案

对于 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);
}

关于c++ - 为什么 unique_ptr 不能推断删除器的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660391/

相关文章:

c++ - unique_ptr 的增量会导致用户定义的运算符出现意外行为!=

c++ - 为什么 VC++ 允许没有完整模板参数的模板类实例?

java - 使用字符串参数调用 AndroidJni 静态方法

c++ - 重载 < 运算符 C++

c++ - OpenCV 如何输入 RGB 图像

c++ - 从 std::array 获取对原始数组的引用

c++ - 使用 libstdc++ 在字符串、u16string 和 u32string 之间转换

c++ - 打印字符串的位表示

c++ - C++ 中变量的默认值使用 cin >>

c++ - std::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs 原始指针