C Lambdas:捕获列表与参数列表

根据C11标准,lambda表达式可以通过捕获列表,参数列表或两者在包围范围内使用变量.

所以,我们来看看同一个代码的两个版本.

1)带捕获

int x = 4;

cout << "With capture  : Factorial of " << x << " = " << [x]() // <= Capture
{
    int r = 1;
    for (int i = x; i > 1; i--) r = r * i;
    return r;
}() << endl;

2)带参数

int x = 4;

cout << "With parameter: Factorial of " << x << " = " << [](int x) // <= Parameter
{
    int r = 1;
    for (int i = x; i > 1; i--) r = r * i;
    return r;
}(x) << endl;

输出为:

With capture  : Factorial of 4 = 24
With parameter: Factorial of 4 = 24

由于我们可以将参数传递给参数列表中的lambdas(与任何C函数一样),为什么需要捕获列表?

有人可以向我显示参数列表不起作用且仅捕获列表的情况吗?

最佳答案
例如使用stl算法:

std::vector<int> items;
int factor;
auto foundItem = std::find_if(items.begin(), items.end(), 
[&factor](int const& a) 
{ 
   return a * factor == 100; 
});

在这种情况下,您在容器中的每个项目都被调用在lambda中,如果值与被捕获因子相乘,则返回.
代码没有什么意义,只是向您展示捕获和参数列表的重要性.

转载注明原文:C Lambdas:捕获列表与参数列表 - 代码日志