当前位置 : 主页 > 编程语言 > c++ >

在C中访问lambda外部的lambda capture初始化变量

来源:互联网 收集:自由互联 发布时间:2021-06-23
在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
在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捕获.如果捕获对象的引用,则外部世界可以访问同一对象.但是您不会访问该对象的相同引用.

网友评论