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

时间:2018-03-12 23:12:46

标签: c++ lambda capture

如何捕获与将参数传递到lambda表达式不同?我何时会使用捕获而不是仅传递一些变量?

供参考:http://en.cppreference.com/w/cpp/language/lambda#Lambda_capture

该引用仅将其定义为逗号分隔值的#34;列表#34;但不是他们的目的或为什么我会使用它们。

要添加:这与"不一样的问题是什么是lambda表达式"因为我不知道lambda表达式是什么或何时使用它。我问的是捕获的目的是什么。捕获是lambda表达式的一个组成部分,并且可以取值,但是在互联网上的其他地方没有很好地解释这些值是什么'预期目的是,以及它与捕获后传递的值有何不同。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

捕获是绑定到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是自由变量(它们不在函数的参数之间),因此需要在形式和时刻绑定到现有对象(即捕获) #39;实例化。在第一种形式中,它们是函数参数,正如您最初建议的那样,因此在表单实例化时不需要绑定到现有对象。区别很明显:f1是三个参数的函数,而f2只接受一个。

更重要的是,捕获包含了lambda的本地上下文,它可以比上下文本身更长久。一个简单的例子:

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

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