c++ lambda捕获列表
来源:互联网 发布:js email正则表达式 编辑:程序博客网 时间:2024/06/08 07:30
原文地址:http://blog.csdn.net/u012945598/article/details/24603251
“ [捕获列表] ”
首先我们观察一下上图中的第一个lambda表达式与第三个lambda表达式的捕获列表部分的区别。
可以看到,上图的第一个表达式中捕获列表为空 [ ],而第三个表达式中的捕获列表中包含了一个等号 [=]。
下面我们再观察一下上图中第一个与第三个lambda表达式的函数体内都使用到了哪些变量。
可以看到,第一个表达式中所有的变量,均是在Lambda表达式中定义的(log除外,因为log函数包含在头文件中),
而在第三个表达式中所使用到的sprite1,sprite2等变量,并不是在lambda表达式中定义的,而是当前函数中或是当前类中的变量。
那么我们就可以总结出,在Lambda表达式的函数体内,是不能够访问到外部的变量的,如果想要使用函数体外定义的变量,就需要将它们进行"捕获",上图第三个lambda表达式采用的正是“值捕获”,与它对应的另外一种为“引用捕获”。
[ ]:空捕获列表,即lambda表达式不能够使用所在函数中的变量
[=]:值捕获,即lambda表达式可以以拷贝的方式访问到函数中变量的值
[&]:引用捕获,即lambda表达式中所使用的其所在函数中的变量均是引用方式
当我们不希望在捕获的时候将所有的变量都捕获的时候,我们可以使用如下的方式进行捕获,例如:
[=sprite1,&sprite2]
这里我们仅仅捕获了两个变量,第一个变量是以值拷贝的方式捕获,第二个是以引用方式捕获,变量与变量之间用逗号分隔。
正常情况下,如果一个变量是值拷贝,Lambda不能改变它的值,如果我们希望改变一个值拷贝的变量的值,就需要在参数列表前加上关键字mutable
例如:
auto s1=10;
auto s2=[=s1](){return ++s1};//错误,因为s1是值拷贝,不能改变s1的值
auto s2=[=s1]() mutable {return ++s1};//正确
- c++ lambda捕获列表
- C++11Lambda捕获列表使用
- C++14 泛型lambda(支持显式的lambda捕获列表)
- c++ lambda表达式捕获类数据…
- C++11中的Lambda表达式构成之——捕获值列表
- c++ lambda 捕获成员变量
- Java Lambda的变量捕获
- [c#]: Lambda
- C#-Lambda
- c#Lambda
- c#lambda
- lambda 和列表推导
- c++ lambda表达式捕获变量参数
- 【c/c++】Lambda表达式
- 将Lambda表达式作为参数传递并解析——在构造函数参数列表中使用Lambda表达式(C#)
- 将Lambda表达式作为参数传递并解析——在构造函数参数列表中使用Lambda表达式(C#)
- C#--Lambda表达式
- C++ox 之 lambda
- Spring MVC Controler层获取errors验证信息 同时返回
- 数据库操作(使用FMDB)
- c语言问题:输入输出数据的问题、if语句的一些问题
- 和我一起学 Selenium WebDriver(6)——基础篇
- JSONModel解析数据成Model 转载
- c++ lambda捕获列表
- 和我一起学 Selenium WebDriver(7)——基础篇
- springMVC+Mybatis
- Temporal anti-aliasing
- IOS开发类似游戏血条 的progressView
- 如何使KVM虚拟机的CPU和物理CPU一模一样?
- 数据挖掘核心技术揭秘——互动出版网
- while continue 更新文件
- 文章标题