c++ 在lambda函数语法中,“捕获列表”的目的是什么?

this question的答案,作为一个例子,这是一个计算std :: vector中的元素总和的代码:

std::for_each(
    vector.begin(),
    vector.end(),
    [&](int n) {
        sum_of_elems += n;
    }
);

我知道lambda函数只是无名功能。

我理解lambda函数语法as explained here

我不明白为什么lambda函数需要捕获列表,而正常的函数不需要。

>捕获列表提供哪些额外信息?
>为什么正常的功能不需要这些信息?
lambda函数不仅仅是无名功能吗?

最佳答案
从您给出的语法链接中,捕获列表“定义了在外部的lambda应该在函数体内可用的内容,以及”

普通功能可以通过以下几种方式使用外部数据:

>静态字段
>实例字段
>参数(包括参考参数)
>全局

Lambda添加了在另一个中具有一个未命名功能的功能。然后,lambda可以使用您指定的值。与普通函数不同,这可以包括外部函数的局部变量。

正如答案所说,您还可以指定要捕获的方式。 awoodland在another answer提供了一些例子。例如,您可以通过引用(如参考参数)捕获一个外部变量,并通过值捕获所有其他变量:

[=, &epsilon]

编辑:

区分签名和lambda在内部使用是很重要的。 lambda的签名是参数类型的有序列表,加上返回值的类型。

例如,一元函数使用特定类型的单个值,并返回另一种类型的值。

但是,在内部可以使用其他值。作为一个琐碎的例子:

[x, y](int z) -> int 
{
   return x + y - z;
}

lambda的调用者只知道它需要一个int并返回一个int。然而,在内部它恰好是通过价值使用另外两个变量。

转载注明原文:c++ 在lambda函数语法中,“捕获列表”的目的是什么? - 代码日志