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

Tra*_*cer 14 c++ lambda c++11

我刚开始用C++学习lambda函数,我不明白为什么lambda只允许捕获自动存储变量?例如:

int x;
int main() {
    [&x](int n){x = n;}; // 'x' cannot be captured...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,静态变量根本不需要捕获

static int s = 0;
[](int n){s = n;};
Run Code Online (Sandbox Code Playgroud)

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

new*_*cct 15

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

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

这就是lambdas可以通过复制捕获局部变量的原因(在创建lambda时复制它们的值).(他们也可以通过引用捕获,作为副本的替代.)

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

  • @Maf:那么这是未定义的行为。这与存储对局部变量的引用并在局部变量的作用域结束后尝试使用该引用相同。 (2认同)

Dak*_*orn 13

你需要改变范围.看这个:

int x = 4;

int main()
{
    cout << "::x = " << ::x << endl;

    [&](int a){ ::x = a; }(2);

    cout << "::x = " << ::x << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

::x = 4
::x = 2
Run Code Online (Sandbox Code Playgroud)