在lambda中捕获名称空间变量

Capturing namespace variable in lambda

本文关键字:空间 变量 lambda      更新时间:2023-10-16

我正在尝试将姓名变量传递给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中递增全局变量?
  2. 为什么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