我阅读了[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;在我阅读本节之后。有人可以提供一些样品吗?谢谢。
答案 0 :(得分:5)
LWG issue 673将pointer
添加到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