在C 14/17中,如何在lambda范围之外访问lambda捕获初始化变量? 资源: #include iostreamusing namespace std;int main(){ auto test = [value1 =0]() mutable {value1+=1; return value1;}; cout test() endl; cout test() endl; //co
资源:
#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捕获初始化变量的生命周期是多少?
试图访问lambda之外的value1会产生以下错误:’value1’未在此范围内声明.
用gcc版本7.3.0编译(Ubuntu 7.3.0-21ubuntu1~14.04).
lambda只是内联定义结构的紧凑定义,以及该结构上的operator()重载(以及用于创建该结构类型的对象). Lambda“capture”只是这个结构的成员变量,由类型的构造函数初始化.这就是为什么C lambdas必须具有通过值和引用捕获的语法的一个原因.但结构的成员变量是私有的.由于编译器生成的结构主要是实现定义的,因此标准不要求使用这些名称公开这些成员.如果需要,编译器生成的结构可以使用其他名称;编译器只需要重新映射这些名称的in-lambda用法来引用成员的名字.
所以不,lambda之外的世界无法访问任何类型的lambda捕获.如果捕获对象的引用,则外部世界可以访问同一对象.但是您不会访问该对象的相同引用.