如何将C中访问lambda外部的lambda capture初始化变量改写成长尾?
- 内容介绍
- 文章标签
- 相关推荐
本文共计450个文字,预计阅读时间需要2分钟。
在C++14/17中,若想在lambda表达式的范围外访问lambda捕获的初始化变量,可以采用以下方法:
方法一:使用引用捕获cppint x=10;auto func=[x=x]() { return x; };这样,lambda函数`func`就可以在范围外访问捕获的变量`x`。
方法二:使用指针捕获cppint x=10;auto func=[&x]() { return x; };这种方法同样允许lambda函数`func`在范围外访问捕获的变量`x`。
注意:使用引用捕获时,捕获的变量必须保证在lambda表达式创建时已经存在。使用指针捕获时,lambda函数可以访问在它创建时已经初始化的变量。
在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捕获.如果捕获对象的引用,则外部世界可以访问同一对象.但是您不会访问该对象的相同引用.
本文共计450个文字,预计阅读时间需要2分钟。
在C++14/17中,若想在lambda表达式的范围外访问lambda捕获的初始化变量,可以采用以下方法:
方法一:使用引用捕获cppint x=10;auto func=[x=x]() { return x; };这样,lambda函数`func`就可以在范围外访问捕获的变量`x`。
方法二:使用指针捕获cppint x=10;auto func=[&x]() { return x; };这种方法同样允许lambda函数`func`在范围外访问捕获的变量`x`。
注意:使用引用捕获时,捕获的变量必须保证在lambda表达式创建时已经存在。使用指针捕获时,lambda函数可以访问在它创建时已经初始化的变量。
在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捕获.如果捕获对象的引用,则外部世界可以访问同一对象.但是您不会访问该对象的相同引用.

