Cppreference:s部分std::unique_ptr显示了以下演示,用于为unique_ptr实例提供自定义删除器:
Run Code Online (Sandbox Code Playgroud)std::unique_ptr<D, std::function<void(D*)>> p(new D, [&](D* ptr) { std::cout << "destroying from a custom deleter...\n"; delete ptr; });
D就这个问题而言,where就是简单的自定义类型,比如说
struct D
{
D() { std::cout << "D CTOR\n"; }
~D() { std::cout << "D DTOR\n"; }
};
Run Code Online (Sandbox Code Playgroud)
此外,上面的参考资料说明了对删除器的以下类型要求:
类型要求
Deletermust beFunctionObjector lvalue reference to aFunctionObjector 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 中使用按引用捕获默认值 ( )是否有任何特殊原因?以下是标准对unique_ptr( [unique.ptr.single]/1 )删除器的说明:
客户端提供的模板参数 D 应为函数对象类型 (20.9)、函数的左值引用或函数对象类型的左值引用,给定类型 D 的值 d 和类型为 unique_ptr:: 的值 ptr:指针,表达式 d(ptr) 是有效的,并且具有为该删除器适当地处理指针的效果。
综上所述,[]和[&]都是完全有效的。
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |