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

时间:2015-05-25 15:17:02

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

我正在阅读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的自定义删除器有哪些规格?

2 个答案:

答案 0 :(得分:3)

对于案例2)您使用的是临时的,因此编译器可以移动它。 在案例3)中,您提供了一个无法移动的对象,因此编译器需要进行复制。

答案 1 :(得分:3)

规范在cppreference(构造函数#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)和移动构造函数的要求   D不得抛出异常。这个unique_ptr将包含一个由...构造的值移动   d
  •   

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