双方unique_ptr并shared_ptr接受定制的析构函数他们所拥有的对象上调用.但在的情况下unique_ptr,析构函数作为一个模板参数传递类,而类型shared_ptr的自定义析构函数将被指定为一个模板参数的构造函数.
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
Run Code Online (Sandbox Code Playgroud)
和
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会有这样的差异.需要什么?
在C++ 11中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);
Run Code Online (Sandbox Code Playgroud)
[util.smartptr.shared.const]类型中的标准要求D为CopyConstructible.为什么需要这个?如果shared_ptr制作d那些删除者中的哪一个可能被调用的副本?是不是shared_ptr只能保留一个删除器?如果可以复制shared_ptr,拥有删除器意味着什么d?
CopyConstructible要求背后的理由是什么?
PS:这个要求可能会使写作删除者复杂化shared_ptr.unique_ptr似乎对其删除有更好的要求.
为什么std::shared_ptr接受删除器作为构造函数参数而不是模板参数?存储类型擦除删除器似乎违背了 C++ 哲学,即不向标准库组件添加任何不必要的开销。
我在这背后看到的唯一逻辑是,由于引用计数的原子增量成本如此之高,因此忽略了通过类型擦除进行的间接成本。但这似乎仍然是不必要的开销。