std::unique_ptr的自定义删除器规范
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
的自定义删除器规格是什么?
该规范在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)
,其中A
是D
的同义词。这些构造函数要求:
要求:
-如果
D
不是左值引用类型,则
- 如果
d
是左值或const
是右值,则将选择这对的第一个构造函数。D
必满足CopyConstructible
的要求(表21),并且D
的复制构造函数不抛出异常。这个unique_ptr
将保存d
的副本。- 否则,
d
是非const
右值,将选择这对的第二个构造函数。D
应满足MoveConstructible
(表20)和move构造函数的要求的D
将不会抛出异常。这个unique_ptr
将保存一个由d
。
第一个要点描述了你的案例(3),第二个要点描述了你的案例(2)。
对于情况2),您使用的是临时文件,因此编译器可以移动它。在第三种情况下,你给了一个不能移动的对象,所以编译器需要复制。
相关文章:
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何使用 C 指针的自定义删除器创建unique_ptr?
- 在地图中使用自定义删除器存储unique_ptr
- 在 C++ 的自定义运算符中删除与删除[](不同于常见的删除与删除[]问题)
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- 在unique_ptr<>中使用自定义删除程序 (curl_formfree())
- C++自定义删除运算符不能正常工作?
- 从自定义数据类型向量中删除重复元素
- shared_ptr的删除程序是否存储在自定义分配器分配的内存中?
- 如何删除Qt设计器中自定义插件的QString属性的"translatable"复选框?
- 如何在我的类unique_ptr中提供自定义删除器?
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- 未调用 std::unique_ptr 中的自定义删除器
- C++ priority_queue与自定义比较器并删除任何项目
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- 在 QLayout 中创建和删除自定义 QWidgets 时出现 RAM 问题
- 无法删除自定义类的堆实例 (C++)
- 无法从 QVBoxLayout 中删除自定义 QWidget
- 删除自定义双链表
- 如何在gtkmm中删除自定义TreeModel中的user_data