在C++11中,
标准要求在 [util.smartptr.shared.const] 类型
std::shared_ptr
有四个构造函数可以传递类型为D
的删除器对象d
。这些构造函数的签名如下:template<class Y, class D> shared_ptr(Y * p, D d);
template<class Y, class D, class A> shared_ptr(Y * p, D d, A a);
template <class D> shared_ptr(nullptr_t p, D d);
template <class D, class A> shared_ptr(nullptr_t p, D d, A a);
标准要求在 [util.smartptr.shared.const] 类型
D
中需要具备可复制构造函数。为什么需要这样做?如果 shared_ptr
复制了 d
,那么哪个删除器可能会被调用?难道一个 shared_ptr
只能保留一个删除器吗?如果 d
能够被复制,那么 shared_ptr
拥有删除器是什么意思?
CopyConstructible 要求背后的原理是什么?
PS:此要求可能会使编写 shared_ptr
的删除器变得更加复杂。相比之下,unique_ptr
对其删除器有更好的要求。
unique_ptr
。他的问题实际上是为什么shared_ptr
禁止使用仅可移动的删除器类型。 - Nicol Bolas