gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:11:09 25 4
gpt4 key购买 nike

我刚开始学习 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;};

那么,为什么第一个示例不允许,而第二个有效?

最佳答案

您需要回过头来问自己:为什么 lambdas 会捕获变量?

Lambda 可以使用外部范围的变量。但是,如果这些是局部变量,它们就会超出范围并且在函数返回后无法使用。但是 lambda 可能会在函数返回后被调用(lambda 可以从函数返回,或者存储在某个全局变量或实例变量中等),并且在函数返回后,它不能直接引用局部变量,因为它们已经不存在了。

这就是为什么 lambda 可以通过复制来捕获局部变量(在创建 lambda 时复制它们的值)。 (他们也可以通过引用捕获,作为复制的替代。)

上述问题只存在于自动存储时长的变量。对于静态存储时长的变量(例如全局变量、静态局部变量),它们在程序的生命周期内都存在,随时访问都没有问题。

关于c++ - 为什么 lambda 只捕获自动存储变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24474957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com