dlo*_*dlo 4 c++ lambda capture
捕获与将参数传递到 lambda 表达式有何不同?我什么时候应该使用捕获而不是仅仅传递一些变量?
供参考:http ://en.cppreference.com/w/cpp/language/lambda#Lambda_capture
该参考仅将其定义为“逗号分隔值列表”,但没有定义它们的用途或我使用它们的原因。
补充一下:这与“什么是 lambda 表达式”不是同一个问题,因为我不是问 lambda 表达式是什么或何时使用它。我问捕获的目的是什么。捕获是 lambda 表达式的组成部分,可以获取值,但互联网上的其他地方没有很好地解释这些值的预期目的是什么,以及它与捕获后传递的值有何不同。
捕获是对 lambda 形式的自由变量的绑定。他们将 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; };
Run Code Online (Sandbox Code Playgroud)
尽管主体相同,但在第二种形式中,x 和 y 是自由变量(它们不绑定在函数的参数之间),因此需要在形式实例化时绑定到现有对象(即捕获)。在第一种形式中,它们是函数参数,正如您首先建议的那样,因此不需要在形式实例化时绑定到现有对象。区别很明显:f1 是三个参数的函数,而 f2 只接受一个。
更重要的是,捕获保留了 lambda 本地上下文的一部分,该部分可以比上下文本身更长久。一个简单的例子:
auto f(int x) {
return [x](int a){ return a + x; };
}
Run Code Online (Sandbox Code Playgroud)
请注意,此函数返回一个新的可调用对象,该对象operator()接受单个 int 并返回一个 int,并在内部使用某个值,该值是函数本地变量的值f(),因此在控件退出函数后将无法再访问。