在C中访问lambda外部的lambda capture初始化变量
发布时间:2020-12-16 09:22:06 所属栏目:百科 来源:网络整理
导读:在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; //cout value1 endl;//erro
在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 } 输出:
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捕获.如果捕获对象的引用,则外部世界可以访问同一对象.但是您不会访问该对象的相同引用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |