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
或左值参考aFunctionObject
或左值函数引用,可用a调用unique_ptr<T, Deleter>::pointer
...
会员类型
pointer
:std::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
实例?)默认这里,但我很确定我错过了一些必要的东西(因此问题)。
[&]
)有什么特别的理由相比,只是使用no-capture([]
)?答案 0 :(得分:4)
以下是关于unique_ptr
( [unique.ptr.single] / 1 )删除的标准说明:
客户端提供的模板参数 d 应该是函数对象类型(20.9),函数的左值引用或函数对象类型的左值引用 为此,给定一个值 d 类型 d 和一个价值 PTR 类型 的unique_ptr ::指针 , 表达方式 d(PTR) 是有效的,并具有处理指针适合该删除器的效果。
根据上述情况,[]
和[&]
都完全有效。