繁体   English   中英

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

[英]Simple custom deleter lambda supplied to std::unique_ptr: why use by-reference capture default ([&]) over no-capture ([])?

背景

Cppreference: 关于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或lvalue引用的FunctionObject或lvalue函数引用,可以使用类型unique_ptr<T, Deleter>::pointer的参数调用

...

会员类型

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

作为上述示例中的删除器lambda的捕获列表,使用[&] 基于Cppreference: 关于lambdas部分 ,正如我所看到的,这个捕获列表在上面的删除器示例中的唯一影响是捕获“按引用的当前对象” [强调我的]:

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

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

  • 有没有特别的理由在上面的例子中使用删除器lambda中的by-reference capture default( [&] ),而不是简单地使用no-capture( [] )?

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

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

从上述情况来看, [][&]都是完全有效的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM