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

时间:2014-06-29 09:53:49

标签: c++ c++11 lambda

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

那么,为什么不允许第一个例子,第二个例子呢?

2 个答案:

答案 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时复制它们的值)。 (它们也可以通过引用捕获,作为副本的替代。)

上述问题仅适用于自动存储持续时间的变量。对于静态存储持续时间的变量(例如全局变量,静态局部变量),它们在程序的生命周期内存在,并且在任何时候访问它们都没有问题。