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

lin*_*nus 2 c++ unique-ptr c++11

我阅读了[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;
...
};
}
Run Code Online (Sandbox Code Playgroud)

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

在阅读本节之后,我仍然无法理解"一切都取决于指针"的目的.是否有人可以提供一些样品?谢谢.

How*_*ant 5

LWG问题673添加pointerunique_ptr规范中.它包含了这个动机的要点:

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

有关boost::offset_ptr可以引用共享内存的智能指针,请参阅参考资料.