gpt4 book ai didi

c++ - 提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用引用捕获默认值 ([&]) 而不是非捕获 ([])?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:02 27 4
gpt4 key购买 nike

背景

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"; }
};

此外,上面的引用说明了删除器的以下类型要求:

Type requirements

Deleter must be FunctionObject or lvalue reference to a FunctionObject or lvalue reference to function, callable with an argument of type unique_ptr<T, Deleter>::pointer

...

Member types

pointer: std::remove_reference<Deleter>::type::pointer if that type exists, otherwise T*. Must satisfy NullablePointer.

作为上例中删除器lambda的捕获列表,[&]用来。基于 Cppreference:s section on lambdas ,正如我所见,上面删除器示例中此捕获列表的唯一作用是捕获“通过引用的当前对象” [强调我的]:

[&] captures all automatic variables odr-used in the body of the lambda by reference and current object by reference if exists.

但正如我从上面理解的那样,提供的 lambda 将简单地用对象的 unique_ptr<T, Deleter>::pointer 调用。 , 无论我们选择 [&][]作为 lambda 的捕获列表。我自己不明白为什么我们要使用引用捕获(对象,这里是 unique_ptr 实例?)这里默认,但我很确定我'我缺少一些重要的东西(因此是问题)。

问题

  • 与简单地使用非捕获 ([&]) 相比,在上述示例中的 deleter lambda 中使用引用捕获默认值 ([]) 是否有任何特殊原因?

最佳答案

以下是标准对 unique_ptr 删除器的描述([unique.ptr.single]/1):

A client-supplied template argument D shall be a function object type (20.9), lvalue-reference to function, or lvalue-reference to function object type for which, given a value d of type D and a value ptr of type unique_ptr::pointer , the expression d(ptr) is valid and has the effect of disposing of the pointer as appropriate for that deleter.

根据以上判断,[][&] 都是完全有效的。

关于c++ - 提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用引用捕获默认值 ([&]) 而不是非捕获 ([])?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42226148/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com