gpt4 book ai didi

C++ : What are the purpose of captures in lambda expressions?

转载 作者:行者123 更新时间:2023-12-04 01:58:09 28 4
gpt4 key购买 nike

捕获与将参数传递给 lambda 表达式有何不同?我什么时候会使用捕获而不是只传递一些变量?

供引用:http://en.cppreference.com/w/cpp/language/lambda#Lambda_capture

该引用仅将其定义为“逗号分隔值列表”,而不是它们的用途或我为什么要使用它们。

补充一点:这与“什么是 lambda 表达式”不是同一个问题,因为我不是在问什么是 lambda 表达式或何时使用它。我在问 capture 的目的是什么。捕获是 lambda 表达式的一个组件,可以接受值,但在 Internet 上的其他地方并没有很好地解释这些值的预期用途是什么,以及它与捕获后传递的值有何不同。

最佳答案

捕获是对 lambda 形式的自由变量的绑定(bind)。他们将 lambda 表达式转换为封闭形式(闭包),没有自由变量。考虑:

auto f1 = [](int a, int x, int y){ return a * x + y; };
int x = 40, y = 2;
auto f2 = [x, y](int a){ return a * x + y; };

尽管主体相同,但在第二种形式中,x 和 y 是自由变量(它们不绑定(bind)在函数的参数中),因此需要在形式实例化时绑定(bind)到现有对象(即捕获)。在第一种形式中,它们是函数参数,正如您首先建议的那样,因此在表单实例化时不需要绑定(bind)到现有对象。区别很明显:f1 是三个参数的函数,而 f2 只接受一个。

更重要的是,捕获持有 lambda 本地上下文的一部分,它可以比上下文本身更长寿。一个简单的例子:

auto f(int x) {
return [x](int a){ return a + x; };
}

请注意,此函数返回一个新的可调用对象,其 operator() 接受单个 int 并返回一个 int,并在内部使用某个值,即函数本地变量的值f(),因此在控件退出函数后就无法再访问了。

关于C++ : What are the purpose of captures in lambda expressions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245830/

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