std::unique_ptr的自定义删除器规范

Custom deleter specifications for std::unique_ptr

本文关键字:删除 自定义 unique ptr std      更新时间:2023-10-16

我正在阅读Josuttis的c++标准库。对于下面的例子,我找不到(2)和(3)注释的原因:

D d;  //instance of the deleter type(1)
unique_ptr<int,D> p1(new int, D()); //D must be  MoveConstructible(2)
unique_ptr<int,D> p2(new int, d);  //D must be CopyConstructible(3)

在这种情况下评论(2)和(3)的原因是什么?

std::unique_ptr的自定义删除器规格是什么?

该规范在cppreference (constructors #3-4)上有准确的描述,并且直接来自c++标准部分[unique.ptr.single.ctor]。由于您的D是非引用类型,因此签名如下:

unique_ptr(pointer p, const A& d);   // your (3)
unique_ptr(pointer p, A&& d);        // your (2)

,其中AD的同义词。这些构造函数要求:

要求:

-如果D不是左值引用类型,则

  • 如果d是左值或const是右值,则将选择这对的第一个构造函数。D必满足CopyConstructible的要求(表21),并且D的复制构造函数不抛出异常。这个unique_ptr将保存d的副本。
  • 否则,d是非const右值,将选择这对的第二个构造函数。D应满足MoveConstructible(表20)和move构造函数的要求的D将不会抛出异常。这个unique_ptr将保存一个由d

第一个要点描述了你的案例(3),第二个要点描述了你的案例(2)。

对于情况2),您使用的是临时文件,因此编译器可以移动它。在第三种情况下,你给了一个不能移动的对象,所以编译器需要复制。