![](/img/trans.png)
[英]Why does unique_ptr have the deleter as a type parameter while shared_ptr doesn't?
[英]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
成为拥有指针的轻量级,几乎无成本的替代品。
可以完成Deductin,但必须更改结果unique_ptr
的类型。
相比之下, shared_ptr
总是具有删除器的状态容量,两个不同的原子计数器和一个指向值的指针。 它的重量更重,而且不是指针的免费替代品。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.