加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

输出:

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捕获.如果捕获对象的引用,则外部世界可以访问同一对象.但是您不会访问该对象的相同引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读