在 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/