【发布时间】:2018-08-09 04:49:53
【问题描述】:
我之前看到了与此代码等效的代码,得知它按预期工作时我有点惊讶:
#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
令我惊讶的是,编译器发现 a 在嵌套 lambda 中使用,并在第一个 lambda 中按值正确捕获它,即使它没有在那里显式使用。即,编译器必须在嵌套 lambda 中的 a 和外部范围中的 a 之间建立连接。我认为参数捕获需要明确(即第一个 lambda 中的[a],嵌套中的[&a])才能正常工作。
自动参数捕获的推演规则是什么?
【问题讨论】:
标签: c++ c++11 lambda template-argument-deduction