我刚刚开始学习 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;};
那么,为什么第一个例子是不允许的,而第二个例子却可以呢?
你需要回去问问自己:为什么 lambda 捕获变量?
Lambda 可以使用外部作用域中的变量。但是,如果这些是局部变量,它们就会超出范围,并且在函数返回后无法使用。但是 lambda 可能会在函数返回后被调用(lambda 可以从函数返回,或者存储在某些全局变量或实例变量中等),并且函数返回后,它不能直接引用局部变量,因为它们不再存在了。
这就是为什么 lambda 可以通过复制捕获局部变量(在创建 lambda 时复制它们的值)。 (他们还可以通过引用捕获,作为复制的替代方法。)
上述问题仅存在于变量自动存储时长。对于静态存储持续时间的变量(例如全局变量、静态局部变量),它们在程序的生命周期内都存在,并且随时访问它们都没有问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)