c++ - 在 lambda 中捕获命名空间变量

标签 c++ 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;
    
}

我有两个问题:

  1. 为什么我无法从 lambda 递增全局变量?
  2. 为什么 lambda 无法捕获 namespace 内的变量?

最佳答案

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

lambda 函数的思想是捕获局部变量,而不是全局变量。如果你想增加一个全局变量,你不需要捕获它:

[](){ data1++; np::data++;} // no problem

捕获全局变量的“特性”有点令人困惑,它的存在只是(我的猜测)因为它们在函数的 block 中可见:

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++ - 在 lambda 中捕获命名空间变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46021683/

相关文章:

java - 多态性中 Java Lambda 表达式的有趣行为

C++ lambda 函数访问写冲突

python - 旋转 Pandas 表 - 特殊问题

c++ - 无法将库与 cmake 中的测试二进制文件链接

c++ - 为什么函数模板的显式实例化不能使用 inline 或 constexpr

c++ - 通过指针取消引用的函数调用语法

c++ - 是否可以在一个语句中进行 2 个相反的位操作?

c++ - 在 Visual Studio 中使用增强测试

Java 8 - 在 lambda 中抛出多个通用检查异常

c++ - 如何返回 std::optional lambda?