提供给std :: unique_ptr的简单自定义删除器lambda:为什么在no-capture([])上使用by-reference capture default([&])?

时间:2017-02-14 12:25:59

标签: c++ lambda

背景

Cppreference:s section on std::unique_ptr显示以下演示,用于向unique_ptr实例提供自定义删除器:

std::unique_ptr<D, std::function<void(D*)>> p(new D, [&](D* ptr)
{
    std::cout << "destroying from a custom deleter...\n";
    delete ptr;
});

D,就本问题而言,就像简单的自定义类型一样,例如

struct D
{
    D() { std::cout << "D CTOR\n"; }
    ~D() { std::cout << "D DTOR\n"; }
};

此外,上面的参考文献在删除器上声明了以下类型要求:

  

类型要求

     

Deleter必须是FunctionObject或左值参考a   FunctionObject或左值函数引用,可用a调用   unique_ptr<T, Deleter>::pointer

类型的参数      

...

     

会员类型

     

pointerstd::remove_reference<Deleter>::type::pointer如果存在该类型,则为T*。必须满足NullablePointer

作为上例中的删除器lambda的捕获列表,使用了[&]。基于Cppreference:s section on lambdas,正如我所看到的,上面的删除示例中此捕获列表的唯一效果是通过引用捕获“当前对象” [强调我的] :

  

[&]捕获在体内使用的所有自动变量   lambda by reference和当前对象(如果存在)

但是正如我从上面所理解的那样,无论我们选择unique_ptr<T, Deleter>::pointer还是[&]作为lambda的捕获列表,都会使用对象的[]简单地调用提供的lambda。我不明白自己为什么要使用by-reference capture( object ,这里是unique_ptr实例?)默认这里,但我很确定我错过了一些必要的东西(因此问题)。

问题

  • 与上述示例中的删除器lambda中使用by-reference capture default([&])有什么特别的理由相比,只是使用no-capture([])?

1 个答案:

答案 0 :(得分:4)

以下是关于unique_ptr [unique.ptr.single] / 1 )删除的标准说明:

  

客户端提供的模板参数   d   应该是函数对象类型(20.9),函数的左值引用或函数对象类型的左值引用   为此,给定一个值   d   类型   d   和一个价值   PTR   类型   的unique_ptr ::指针   , 表达方式   d(PTR)   是有效的,并具有处理指针适合该删除器的效果。

根据上述情况,[][&]都完全有效。