提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用按引用捕获默认值 ([&]) 而不是非捕获 ([])?

dfr*_*fri 6 c++ lambda

背景

Cppreference:s部分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;
});
Run Code Online (Sandbox Code Playgroud)

D就这个问题而言,where就是简单的自定义类型,比如说

struct D
{
    D() { std::cout << "D CTOR\n"; }
    ~D() { std::cout << "D DTOR\n"; }
};
Run Code Online (Sandbox Code Playgroud)

此外,上面的参考资料说明了对删除器的以下类型要求:

类型要求

Deletermust be FunctionObjector lvalue reference to a FunctionObjector lvalue reference to function, callable with an argument of typeunique_ptr<T, Deleter>::pointer

...

会员类型

pointer:std::remove_reference<Deleter>::type::pointer如果该类型存在,否则T*. 必须满足NullablePointer

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

[&]如果存在,则通过引用捕获 lambda 主体中 odr-used 的所有自动变量,并通过引用捕获当前对象

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

  • [&]与简单地使用不捕获 ( [])相比,在上面的示例中的删除器 lambda 中使用按引用捕获默认值 ( )是否有任何特殊原因?

Sin*_*all 5

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

客户端提供的模板参数 D 应为函数对象类型 (20.9)、函数的左值引用或函数对象类型的左值引用,给定类型 D 的值 d 和类型为 unique_ptr:: 的值 ptr:指针,表达式 d(ptr) 是有效的,并且具有为该删除器适当地处理指针的效果。

综上所述,[][&]都是完全有效的。