在lambda中捕获名称空间变量
Capturing namespace variable in lambda
我正在尝试将姓名变量传递给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;
}
我有两个问题:
- 为什么我无法从lambda中递增全局变量?
- 为什么lambda无法在命名空间内捕获变量?
这不是一个完整的答案,但我希望它会有所帮助。
lambda函数的想法是捕获局部变量,而不是全局变量。如果要增加全局变量,则无需捕获它:
[](){ data1++; np::data++;} // no problem
捕获全局变量的"功能"有点令人困惑,并且仅存在(我的猜测),因为它们在函数的块中可见:
int data1;
int main()
{
int data_local;
[&data1, // superfluous, but works anyway
&data_local // useful
](){data1++; data_local++};
}
由于命名空间在本地不可能,因此无法捕获名称空间中的全局变量 - 这将是无用的功能。我认为,捕获命名空间之外的全局变量也是没有用的,此外也令人困惑,因此,如果Lambda捕获了这样的全球变量,则会发出错误。编译器实际上发出警告。
最后,上面的代码仅"声明" lambda函数(实际上,它仅"提及"它 - 无法使用此"声明" lambda)。要称呼它,请附加参数列表:
[](){data1++;}; // "declaration"
[](){data1++;}(); // call
相关文章:
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 在命名空间 c++ 中正确声明 extern 变量
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 在命名空间中定义变量
- 初始化命名空间中的变量是否类似于将它们初始化为类成员?
- 如何访问嵌套在命名命名空间中的未命名命名空间变量?
- 命名空间内C++变量声明
- C++从 std::async 函数读取命名空间中的全局变量标志
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- C++:.cpp中"Redeclare"外部命名空间变量
- 作用域中定义的变量与注入该作用域的命名空间变量
- Metal - 线程本地的命名空间变量?
- 在lambda中捕获名称空间变量
- C++VS2010链接器关于命名空间变量的错误
- 如果全局中存在相同的变量,如何访问匿名命名空间变量
- 内联命名空间变量有内部链接吗?如果没有,为什么下面的代码有效
- 静态成员变量和命名空间变量有什么区别?
- 命名空间变量的多重定义,C++编译
- 如何查找声明名称空间变量的文件
- 与命名空间变量进行比较