[英]size of std::unique_ptr object with custom deleter (a lambda with capture by-ref)
[英]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
的参数调用...
会员类型
pointer
:std::remove_reference<Deleter>::type::pointer
如果该类型存在,否则为T*
。 必须满足NullablePointer
。
作为上述示例中的删除器lambda的捕获列表,使用[&]
。 基于Cppreference: 关于lambdas的部分 ,正如我所看到的,这个捕获列表在上面的删除器示例中的唯一影响是捕获“按引用的当前对象” [强调我的]:
[&]
通过引用捕获lambda主体中使用的所有自动变量,如果存在 ,则通过引用捕获当前对象 。
但正如我从上面所理解的那样,无论我们选择[&]
还是[]
作为lambda的捕获列表,都会使用对象的unique_ptr<T, Deleter>::pointer
简单地调用提供的lambda。 我不明白为什么我们想要使用by-reference capture( 对象 ,这里的unique_ptr
实例?)默认在这里,但我很确定我缺少必要的东西(因此问题) 。
[&]
),而不是简单地使用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.