我刚开始用C ++学习lambda函数,我不明白为什么lambda只允许捕获自动存储变量?例如:
int x;
int main() {
[&x](int n){x = n;}; // 'x' cannot be captured...
return 0;
}
另一方面,静态变量根本不需要捕获
static int s = 0;
[](int n){s = n;};
那么,为什么不允许第一个例子,第二个例子呢?
答案 0 :(得分:13)
您需要更改范围。看看这个:
int x = 4;
int main()
{
cout << "::x = " << ::x << endl;
[&](int a){ ::x = a; }(2);
cout << "::x = " << ::x << endl;
return 0;
}
输出:
::x = 4
::x = 2
答案 1 :(得分:12)
你需要回过头来问问自己:为什么lambda会捕获变量?
Lambdas可以使用外部作用域中的变量。但是,如果这些是局部变量,则它们超出范围,并且在函数返回后无法使用。但是函数返回后可能会调用lambda(lambda可以从函数返回,或存储在某个全局或实例变量中等),并且在函数返回后,它不能直接引用局部变量,因为它们不复存在了。
这就是为什么lambda可以通过复制捕获局部变量(在创建lambda时复制它们的值)。 (它们也可以通过引用捕获,作为副本的替代。)
上述问题仅适用于自动存储持续时间的变量。对于静态存储持续时间的变量(例如全局变量,静态局部变量),它们在程序的生命周期内存在,并且在任何时候访问它们都没有问题。