gpt4 book ai didi

c++ - 在 C++ 中访问 lambda 之外的 lambda 捕获初始化变量

转载 作者:行者123 更新时间:2023-12-01 14:58:11 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com