我试图将namespace变量传递给lambda,并从lambda函数中获取递增的变量。
这是我的节目
// Example program
#include <iostream>
#include <string>
#include <functional>
using namespace std;
namespace np
{
int data = 0;
}
int data1 = 0;
int main()
{
// cout << np::data <<endl; // compiler error :unable to capture the variable within namepspace
// [&np::data](){ np::data++;};
// cout << np::data <<endl;
cout << data1 <<endl; //unable to increment the global variable from lamba
[&data1](){ data1++;};
cout << data1 <<endl;
}
我有两个问题:
1.为什么我不能从lambda开始递增全局变量?
1.为什么lambda无法捕获名称空间中的变量?
1条答案
按热度按时间mwngjboj1#
这不是一个完整的答案,但我希望它会有所帮助。
lambda函数的思想是捕获局部变量,而不是全局变量。如果你想增加一个全局变量,你不需要捕获它:
捕获全局变量的“特性”有点令人困惑,它之所以存在(我的猜测),只是因为它们在函数的块中可见:
由于名称空间在本地是不可能的,因此名称空间中的全局变量不能被捕获--这将是一个无用的特性。在我看来,捕获名称空间之外的全局变量也是无用的,而且会令人困惑,所以如果lambda捕获了这样一个全局变量,最好发出一个错误。编译器实际上会对这种情况发出一个警告。
最后,上面的代码只是“声明”了一个lambda函数(实际上,它只是“提到”了它--没有办法使用这个“声明”的lambda)。要调用它,请附加一个参数列表: