我正在阅读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
的自定义删除器有哪些规格?
答案 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)
其中A
是D
的同义词。这些构造函数需要:
需要:
- 如果
D
不是左值参考类型,那么
- 如果
的副本d
是左值或const
右值,则会选择此对的第一个构造函数。D
应该 满足CopyConstructible
的要求(表21),D
的复制构造函数不会抛出异常。此unique_ptr
将保留d
。- 否则,
d
是非const
右值,并且将选择该对的第二个构造函数。D
应满足MoveConstructible
(表20)和移动构造函数的要求D
不得抛出异常。这个unique_ptr
将包含一个由...构造的值移动d
。
第一个要点描述了你的情况(3),第二个要点描述了你的情况(2)。