【发布时间】:2017-02-14 12:25:59
【问题描述】:
背景
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或左值引用FunctionObject或对函数的左值引用,可使用unique_ptr<T, Deleter>::pointer类型的参数...
会员类型
pointer:std::remove_reference<Deleter>::type::pointer如果该类型存在,否则T*。必须满足NullablePointer。
作为上例中删除器 lambda 的捕获列表,使用了[&]。根据 Cppreference:s section on lambdas,在我看来,上面删除器示例中这个捕获列表的唯一效果是捕获“当前对象通过引用” [强调我的]:
[&]捕获所有自动变量 odr-用于 lambda 引用和 如果存在则引用当前对象。
但正如我从上面所理解的那样,无论我们选择[&] 还是[] 作为 lambda 的捕获列表,都将简单地使用对象的 unique_ptr<T, Deleter>::pointer 调用提供的 lambda。我自己不明白为什么我们要使用引用捕获(object,这里是 unique_ptr 实例?)默认在这里,但我很确定我'我错过了一些必不可少的东西(因此提出了问题)。
问题
- 与仅使用无捕获 (
[]) 相比,在上述示例中的删除器 lambda 中使用按引用捕获默认值 ([&]) 有什么特别的原因吗?
【问题讨论】:
-
不太接近答案,但“当前对象”将是
p是成员函数的实例,即*this。如果p不是成员函数,则无关紧要(因此“如果存在”)。 -
我认为这只是一个错字,或者示例的作者并没有太在意。毕竟,这并没有降低示例的有效性,不是吗?
-
@SingerOfTheFall 感谢您的反馈。我对示例的有效性不太感兴趣,而是如果我在选择捕获列表时遗漏了一些基本意图(因为我对 C++ 的这些部分不是很精通)。如果答案是,“可能没有特别的意图;两种选择都有效”,那么我对这样的答案很满意。
-
@Quentin 我明白了,这与 SingerOfTheFall 上面的评论一致,因为在这种特殊情况下
[&]似乎是多余的(我错误地认为“当前对象”将是 @ 987654348@ 本身,因为它是调用删除器时参数的提供者)。