在lamba中捕获命名空间变量

时间:2017-09-03 08:41:01

标签: c++ lambda

我正在尝试将namepace变量传递给lamba,并从lamba函数中获取变量。

这是我的程序

// 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.为什么我无法从lamba增加全局变量? 2.为什么lambda无法在名称空间中捕获变量?

1 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但我希望它会有所帮助。

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