C++ C++;:lambda表达式中捕获的目的是什么?

C++ C++;:lambda表达式中捕获的目的是什么?,c++,lambda,capture,C++,Lambda,Capture,捕获与向lambda表达式传递参数有何不同?我什么时候会使用捕获而不是仅仅传递一些变量 供参考: 引用仅将其定义为“逗号分隔值列表”,而不是它们的用途或使用它们的原因 补充:这与“什么是lambda表达式”的问题不同,因为我不是在问什么是lambda表达式或何时使用它。我问的是捕获的目的是什么。捕获是lambda表达式的一个组件,可以获取值,但在internet的其他地方没有很好地解释这些值的预期用途,以及它们与捕获后传递的值有何不同。您可能希望将lambda传递给使用特定数量参数调用它的函数(

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

供参考:

引用仅将其定义为“逗号分隔值列表”,而不是它们的用途或使用它们的原因


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

您可能希望将lambda传递给使用特定数量参数调用它的函数(例如,
std::find_if
向函数传递单个参数)。捕获变量可以有效地获得更多输入(或输出,如果通过引用捕获)。

捕获是对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; };
尽管实体是相同的,但在第二种形式中,x和y是自由变量(它们不在函数的参数之间绑定),因此需要绑定到现有对象(即捕获)在窗体实例化时。在第一个窗体中,它们是函数参数,正如您第一次建议的,因此在窗体实例化时不需要绑定到现有对象。区别很明显:f1是三个参数的函数,而f2只接受一个参数

更重要的是,捕获保存了lambda本地上下文的一部分,该部分可以超过上下文本身。一个简单的示例:

auto f(int x) {
    return [x](int a){ return a + x; };
}
请注意,此函数返回一个新的可调用对象,该对象的
操作符()
接受一个int并返回一个int,并且在内部使用某个值,该值是函数
f()
的局部变量值,因此在控件退出该函数后不再可访问。

可能的重复项“我不是问什么是lambda表达式或何时使用它。”捕获是lambda表达式的基本部分。“捕获是lambda表达式的基本部分。”没有描述捕获的目的。