c++ - 在 C++ 中访问 lambda 之外的 lambda 捕获初始化变量

标签 c++ lambda initialization c++14

在 C++14/17 中,如何访问 lambda 范围之外的 lambda 捕获初始化变量?
来源:

#include <iostream>

using namespace std;

int main(){
    auto test = [value1 =0]() mutable {value1+=1; return value1;};
    cout << test() << endl;
    cout << test() << endl;
    //cout << value1 << endl;//error: ‘value1’ was not declared in this scope
}
输出:

1

2


value1可在 test() 范围之外访问的变量 lambda ? lambda 捕获初始化变量的生命周期是多少?
尝试访问 value1在 lambda 之外给出以下 error: ‘value1’ was not declared in this scope .
使用 gcc 版本 7.3.0 (Ubuntu 7.3.0-21ubuntu1~14.04) 编译。

最佳答案

lambda 只是内联定义结构和 operator() 的紧凑定义。重载该结构(并用于创建该结构类型的对象)。 Lambda“捕获”只是这个结构的成员变量,由类型的构造函数初始化。这就是为什么 C++ lambda 必须具有按值捕获与按引用捕获的语法的原因之一。

但是结构的成员变量是私有(private)的。并且由于编译器生成的结构在很大程度上是实现定义的,因此标准不需要公开具有这些名称的那些成员。如果需要,编译器生成的结构可以使用其他名称;编译器只需重新​​映射这些名称的 in-lambda 用法即可引用成员的名称。

所以不,任何类型的 lambda 捕获都不能被该 lambda 之外的世界访问。如果您捕获对对象的引用,那么外部世界就有可能访问同一个对象。但是您不会访问对该对象的相同引用。

关于c++ - 在 C++ 中访问 lambda 之外的 lambda 捕获初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59788132/

相关文章:

c++ - 指定构造函数时的不同行为列表初始化

c++ - 强制 C++11 lambda 捕获变量

c - 为什么这个非空终止字符串被正确打印

c++ - 关于一个简单的随机数生成问题的建议。

C++ 全局函数和 OOP?

c# - 展平 Lambda 表达式以访问集合属性成员名称

java - Map 函数 Java 8 的多个输入参数

union 体可以在声明中初始化吗?

c++ - 由于 ELFCLASS64 错误,如何使用 "make"来使用 64 位库

c++ - 构造函数和 operator= 具有动态内存分配