为什么 lambda 只捕获自动存储变量?

2024-03-24

我刚刚开始学习 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(使用前将#替换为@)

为什么 lambda 只捕获自动存储变量? 的相关文章

随机推荐