相关疑难解决方法(0)

为什么unique_ptr在shared_ptr只占用一个时会占用两个模板参数?

双方unique_ptrshared_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++ std shared-ptr unique-ptr c++11

63
推荐指数
1
解决办法
3714
查看次数

为什么shared_ptr删除者必须是CopyConstructible?

在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似乎对其删除有更好的要求.

c++ shared-ptr language-lawyer c++11

37
推荐指数
1
解决办法
856
查看次数

为什么`std::shared_ptr` 存储类型擦除删除器

为什么std::shared_ptr接受删除器作为构造函数参数而不是模板参数?存储类型擦除删除器似乎违背了 C++ 哲学,即不向标准库组件添加任何不必要的开销。

我在这背后看到的唯一逻辑是,由于引用计数的原子增量成本如此之高,因此忽略了通过类型擦除进行的间接成本。但这似乎仍然是不必要的开销。

c++ atomic type-erasure shared-ptr c++11

5
推荐指数
0
解决办法
345
查看次数