为什么unique_ptr无法推断出删除程序的类型?
Why can't unique_ptr infer the type of the deleter?
假设我想使用带有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);
而且您不能从custom_deleter
构建std::default_delete<int>
.
推断删除器类型的唯一方法是在该部分使用模板推导:
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);
}
它无法推断删除程序的类型,因为默认情况下unique_ptr
没有专用于删除程序的状态:默认删除程序是无状态的。
在您的情况下,删除器需要一个指针的状态值,因此它不能"适合"std::unique_ptr
的状态(这只是指向T
的指针)。
这使得unique_ptr
成为拥有指针的轻量级、几乎免费的替代品。
可以进行扣除,但必须更改结果unique_ptr
的类型。
相比之下,shared_ptr
始终具有删除器、两个不同的原子计数器和指向值的指针的状态容量。 它的重量更重,而不是指针的免费替代品。
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在unique_ptr<>中使用自定义删除程序 (curl_formfree())
- 如何从 CLion 的运行窗口中删除程序项目路径
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 连接到MS SQL的程序类型超出范围
- 为什么删除此类型别名中的 const 限定符?
- 用于unique_ptr的有状态自定义删除程序
- 删除模板/类型名后算法变慢C++
- 为什么unique_ptr不能阻止自定义删除程序的切片?
- 提升::不满足 ASIO 读取处理程序类型要求
- 为什么make_tuple删除参数类型的引用
- 如何在C++中删除矢量类型的重复项<string>?
- std::shared_ptr 在空指针上调用非默认删除程序
- std::unique_ptr 和自定义删除程序
- 如何避免多个删除程序 lambda
- 如何使用lambda和函数作为unique_ptr的自定义删除程序
- std::unique_ptr,自定义删除程序和类型更改
- shared_ptr<EVP_PKEY> EVP_PKEY_free作为自定义删除程序会导致堆损坏
- 使用自定义删除程序返回unique_ptr的 nullptr 失败
- 为什么unique_ptr无法推断出删除程序的类型?