c++11新特性(4) lambda捕捉块
捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用.
能够使用两种方式来捕捉所在的作用域中的全部变量.
[=]:通过值捕捉全部变量
[&]:通过引用捕捉全部变量
指定空白的捕捉块[]表示不从所在作用域中捕捉变量.
还能够指定捕捉哪些变量以及这些变量的捕捉方法.
[&x],仅仅通过引用捕捉x,不捕捉其它变量.
[x] 仅仅通过值捕捉x,不捕捉其它变量.
[=,&x,&y],默认值捕捉,变量x,y是例外,通过引用捕捉.
[&,x],默认引用捕捉,X通过值捕捉.
[&x,&x],非法,标识符不同意反复.
先看一个简单的不捕捉不论什么变量的样例.
#include <iostream>
using namespace std;
int main(){
int n=6;
int k=99;
cout<<"In first n="<<n<<" k="<<k<<endl;
[](){n=n*2,k=k+1;}();
cout<<"now n="<<n<<" k="<<k<<endl;
}
结果
能够看到,未被捕获的变量不能在lambda里面使用.
再来看看通过值捕捉
#include <iostream>
using namespace std;
int main(){
int n=6;
int k=99;
cout<<"In first n="<<n<<" k="<<k<<endl;
[=](){n=n*2,k=k+1;}();
cout<<"now n="<<n<<" k="<<k<<endl;
}
结果:
先来看看上一节中关于mutable的介绍:
mutable:(可选):假设所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能改动这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能改动这些副本的值.假设lambda表达式标记为mutable,那么这些副本则不是const,因此主体能够改动这些本地副本.(类似于參数传递中的值传递以及引用传递改动源值)
因此,假设想在lambda中改动捕获的值,应声明为mutable
#include <iostream>
using namespace std;
int main(){
int n=6;
int k=99;
cout<<"In first n="<<n<<" k="<<k<<endl;
[=]()mutable{n=n*2,k=k+1;}();
cout<<"now n="<<n<<" k="<<k<<endl;
}
结果:
为什么改动了之后,m和k的值都不变呢?原因是事实上通过值捕获的都是副本来的,细致看mutable就能够看到了.
那么通过引用捕捉呢?
#include <iostream>
using namespace std;
int main(){
int n=6;
int k=99;
cout<<"In first n="<<n<<" k="<<k<<endl;
[&]()mutable{n=n*2,k=k+1;}();
cout<<"now n="<<n<<" k="<<k<<endl;
}
能够看到,仅仅有通过引用捕获,才干改动外部变量的值!
关于lambda捕捉块的介绍就到这里了.
c++11新特性(4) lambda捕捉块相关推荐
- C++11新特性之lambda表达式
lambda表达式的特性 Lambda 表达式用于定义并创建匿名的函数对象,用于替代简单的函数. lambda表达式的示例代码 lambda表达式的格式为 [ capture ] ( params ) ...
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)
2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...
- C++11新特性——λ(lambda)表达式详解
C++11新特性--λ(lambda)表达式 C++11中引入了λ表达式,它可以用来定义一个内联(inline)的函数,作为一个本地的对象或者一个参数.有了λ表达式,我们可以很方便的使用stl标准库. ...
- java9特性_96.java基础10(java9/10/11新特性)
126.java 9 新特性1(模块化功能): 1.java模块化 2.java 交互式环境jshell 3.泛型 package com.atguigu.java; import org.junit ...
- 【C/C++】C++98基础上的C++11新特性
一.新语法 1.自动类型推导auto auto的自动推导,用于从初始化表达式中推断出变量的数据类型. //C++98 int a = 10; string s = "abc"; f ...
- 【C++面试宝典】C++11新特性知识总结
目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...
- C++11新特性(原封不动转载待查)
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...
- Java 8 新特性之Lambda
Java 8 新特性之Lambda.Stream.Optional Java 8 新特性之Lambda.Stream.Optional 速度更快 代码更少(增加了新的语法Lambda表达式) 强大的S ...
最新文章
- 2015春节期间读完两本书,立贴为证。
- javafx 调用java_Java,JavaFX的流畅设计风格滑块
- 导入一个android项目需要改什么意思,导入别人的Android Studio项目前要修改的文件...
- mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况
- Linux 压缩与解压
- 信息学奥赛一本通(1247:河中跳房子)
- PHP代码规范[转]
- 浅谈数学中的化归原则
- hierbernate 关闭缓存设置_CDN与其他层面缓存
- 小米 html5定位失败,小米手表GPS定位慢怎么办 GPS定位失败及室内无法定位解决方法...
- 【图像融合】基于matlab小波变换灰色图像融合(含相关性、信噪比)【含Matlab源码 1841期】
- 安徽汽车网程序员删库跑路?安徽汽车官网只剩3张图片!
- python分号怎么用_go、java已经python中分号的使用
- 忘记电脑开机密码怎么办、win10、win7忘记开机密码怎么解决
- 简单3步打造明星气质妆容 清凉入夏
- 程序员如何掌握计算机英语(转)
- 公众号 多服务器配置_公众号发布的文章越多,涨粉越多吗?
- python图像纹理提取_提取图像的颜色、纹理特征(传统算法)
- 输入十进制数字,中文大写数字的形式读出
- 全球与中国冷冻莴苣市场深度研究分析报告