关于unique_ptr中的原始指针的类型

时间:2015-03-02 10:47:56

标签: c++ c++11 unique-ptr

我阅读了[The C ++ Standard Library Second Edition]一书,并找到了以下部分:

namespace std {
template <typename T, typename D>
class unique_ptr<T[], D>
{
public:
typedef ... pointer; // may be D::pointer
typedef T element_type;
typedef D deleter_type;
...
};
}

元素类型T可能为void,因此唯一指针拥有未指定的对象 类型,像void *一样。还要注意,定义了一个类型指针,它不一定是定义的 作为T *。如果删除器D具有指针typedef,则将使用此类型。在这种情况下, 模板参数T仅具有类型标记的效果,因为没有成员作为其一部分 class unique_ptr&lt;&gt;这取决于T;一切都取决于指针。 的优势在于 因此,unique_ptr可以容纳其他智能指针。

我仍然无法理解&#34的目的;一切都取决于指针&#34;在我阅读本节之后。有人可以提供一些样品吗?谢谢。

2 个答案:

答案 0 :(得分:5)

LWG issue 673pointer添加到unique_ptr规范中。它包含了这个动机的要点:

  
      
  • 已经努力在共享内存上下文中更好地支持容器和智能指针。这样的关键障碍之一   支持不假设指针类型实际上是T*。这个   可以通过删除器轻松完成unique_ptr   定义指针类型:D::pointer。此外,这种类型可以   如果删除者T*选择不这样做,则很容易默认为D   定义指针类型(这里的示例实现[断开链接])。这个   更改没有运行时间开销。它没有接口开销   自定义delter类型的作者。它只允许(但不要求)   自定义删除器类型的作者,用于定义智能指针   存储类型unique_ptr如果他们发现此类功能有用。   std::default_delete是默认删除的示例   通过简单地忽略此问题而不包括a来指向T*的指针   pointer typedef
  •   

有关可引用共享内存的示例智能指针,请参阅boost::offset_ptr

答案 1 :(得分:-1)

unique_ptr的设计方式是,如果你没有在声明中提供删除器,由于默认的模板参数,它使用的默认值为{{1} {/ 1} “你的指针。它使用SFINAE在Deleter Type中查找“pointer”的定义。如果你的std::default_delete<T>拥有另一个smart_ptr(定义了“指针”),那么在析构函数中,它会调用你所持有的delete的删除者。

示例:

unique_ptr