我之前看到过这段代码的等效版本,但我有点惊讶它能按预期工作:
#include <iostream>
int main()
{
int a = 10;
[=]() mutable {
[&]() {
a += 10;
std::cout << "nested lambda: a=" << a << std::endl;
}(); // call nested lambda
}(); // call first lambda
std::cout << "a=" << a << std::endl;
}
按要求,输出结果为
nested lambda: a=20
a=10
我很惊讶编译器能够推断出嵌套lambda表达式中使用了a
,并且即使第一个lambda表达式中没有显式地使用它,也可以正确地按值捕获它。也就是说,编译器必须将嵌套lambda表达式中的a
与外部作用域中的a
联系起来。我原以为需要显式指定参数捕获(即在第一个lambda中使用[a]
,在嵌套lambda中使用[&a]
)才能实现。
自动参数捕获的推断规则是什么?