std::unique\u 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) D//删除器类型(1)的实例 唯一的ptr p1(新的int,D())//D必须是可移动的(2) 唯一的ptr p2(新整数,d)//D必须是可复制的(3)

std::unique\u 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) D//删除器类型(1)的实例 唯一的ptr p1(新的int,D())//D必须是可移动的(2) 唯一的ptr p2(新整数,d)//D必须是可复制的(3),c++,c++11,c++14,unique-ptr,C++,C++11,C++14,Unique Ptr,在这种情况下,评论(2)和(3)的理由是什么 对于std::unique\u ptr,自定义删除器的规范是什么?对于案例2)您使用的是临时删除器,因此编译器可以移动它。 在案例3)中,您提供了一个无法移动的对象,因此编译器需要制作一个副本。对于案例2)您使用的是临时对象,因此编译器可以移动它。 在案例3),你给了一个不能移动的对象,所以编译器需要复制。 < p>规范被精确描述(构造函数3-4),直接来自C++标准部分[唯一的.PTR.No.cto]。由于您的D是非参考类型,签名如下: 其中A是D

在这种情况下,评论(2)和(3)的理由是什么

对于
std::unique\u ptr
,自定义删除器的规范是什么?

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

对于案例2)您使用的是临时对象,因此编译器可以移动它。
在案例3),你给了一个不能移动的对象,所以编译器需要复制。

< p>规范被精确描述(构造函数3-4),直接来自C++标准部分[唯一的.PTR.No.cto]。由于您的
D
是非参考类型,签名如下:

其中
A
D
的同义词。这些施工人员需要:

要求:

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

  • 如果
    d
    是左值或
    const
    rvalue,则将选择此对的第一个构造函数<代码>D应 满足
    CopyConstructible
    (表21)的要求,
    D
    的复制构造函数不应抛出异常。此
    唯一\u ptr
    将保存
    d
    的副本
  • 否则,
    d
    是一个非
    const
    r值,将选择该对的第二个构造函数<代码>D 应满足
    可移动的
    (表20)和移动构造函数的要求 of
    D
    不应引发异常。此
    唯一\u ptr
    将保存一个由
    d

第一个弹着点描述了您的情况(3),第二个描述了您的情况(2)。

< P>规范(在构造函数3-3)上被精确描述,并且直接来自C++标准部分[独特的.PTR.No.cto]。由于您的
D
是非参考类型,签名如下:

其中
A
D
的同义词。这些施工人员需要:

要求:

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

  • 如果
    d
    是左值或
    const
    rvalue,则将选择此对的第一个构造函数<代码>D应 满足
    CopyConstructible
    (表21)的要求,
    D
    的复制构造函数不应抛出异常。此
    唯一\u ptr
    将保存
    d
    的副本
  • 否则,
    d
    是一个非
    const
    r值,将选择该对的第二个构造函数<代码>D 应满足
    可移动的
    (表20)和移动构造函数的要求 of
    D
    不应引发异常。此
    唯一\u ptr
    将保存一个由
    d

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

这其中哪部分你有问题?这其中哪部分你有问题?
unique_ptr(pointer p, const A& d);   // your (3)
unique_ptr(pointer p, A&& d);        // your (2)