[英]Custom deleter specifications for std::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),您使用的是临时文件,因此编译器可以移动它。 在情况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
的move构造函数不得引发异常。 此unique_ptr
将保存从d
构造的值移动。
第一个要点描述您的情况(3),第二个要点描述您的情况(2)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.