我刚开始用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时复制它们的值).(他们也可以通过引用捕获,作为副本的替代.)
以上问题仅适用于自动存储持续时间的变量.对于静态存储持续时间的变量(例如全局变量,静态局部变量),它们在程序的生命周期中存在,并且在任何时候访问它们都没有问题.
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)
| 归档时间: |
|
| 查看次数: |
8191 次 |
| 最近记录: |