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捕捉块相关推荐

  1. C++11新特性之lambda表达式

    lambda表达式的特性 Lambda 表达式用于定义并创建匿名的函数对象,用于替代简单的函数. lambda表达式的示例代码 lambda表达式的格式为 [ capture ] ( params ) ...

  2. C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...

  3. C++11新特性——λ(lambda)表达式详解

    C++11新特性--λ(lambda)表达式 C++11中引入了λ表达式,它可以用来定义一个内联(inline)的函数,作为一个本地的对象或者一个参数.有了λ表达式,我们可以很方便的使用stl标准库. ...

  4. java9特性_96.java基础10(java9/10/11新特性)

    126.java 9 新特性1(模块化功能): 1.java模块化 2.java 交互式环境jshell 3.泛型 package com.atguigu.java; import org.junit ...

  5. 【C/C++】C++98基础上的C++11新特性

    一.新语法 1.自动类型推导auto auto的自动推导,用于从初始化表达式中推断出变量的数据类型. //C++98 int a = 10; string s = "abc"; f ...

  6. 【C++面试宝典】C++11新特性知识总结

    目录 C++11新特性 auto自动类型推导 decltype类型指示符 nullptr常量 lambda表达式(匿名函数) 智能指针 auto_ptr unique_ptr shared_ptr w ...

  7. C++11新特性(原封不动转载待查)

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  8. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  9. Java 8 新特性之Lambda

    Java 8 新特性之Lambda.Stream.Optional Java 8 新特性之Lambda.Stream.Optional 速度更快 代码更少(增加了新的语法Lambda表达式) 强大的S ...

最新文章

  1. 2015春节期间读完两本书,立贴为证。
  2. javafx 调用java_Java,JavaFX的流畅设计风格滑块
  3. 导入一个android项目需要改什么意思,导入别人的Android Studio项目前要修改的文件...
  4. mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况
  5. Linux 压缩与解压
  6. 信息学奥赛一本通(1247:河中跳房子)
  7. PHP代码规范[转]
  8. 浅谈数学中的化归原则
  9. hierbernate 关闭缓存设置_CDN与其他层面缓存
  10. 小米 html5定位失败,小米手表GPS定位慢怎么办 GPS定位失败及室内无法定位解决方法...
  11. 【图像融合】基于matlab小波变换灰色图像融合(含相关性、信噪比)【含Matlab源码 1841期】
  12. 安徽汽车网程序员删库跑路?安徽汽车官网只剩3张图片!
  13. python分号怎么用_go、java已经python中分号的使用
  14. 忘记电脑开机密码怎么办、win10、win7忘记开机密码怎么解决
  15. 简单3步打造明星气质妆容 清凉入夏
  16. 程序员如何掌握计算机英语(转)
  17. 公众号 多服务器配置_公众号发布的文章越多,涨粉越多吗?
  18. python图像纹理提取_提取图像的颜色、纹理特征(传统算法)
  19. 输入十进制数字,中文大写数字的形式读出
  20. 全球与中国冷冻莴苣市场深度研究分析报告

热门文章

  1. 最后一天,特邀小姐姐配音拉票,今日可投28票
  2. java 实现支持向量机
  3. mysql导入sqlserver数据库表
  4. PyQt5应用与实践
  5. mysql全备份+增量备份笔记总结
  6. CCNA课堂练习:OSPF的介绍及配置
  7. (转)java中的 | ^ 分别是什么?
  8. 在Ubuntu上安装RealPlayer的方法
  9. java参数化查询_小博老师解析Java核心技术 ——JDBC参数化查询(二)
  10. python中关键字 表示空类型_python中什么表示空类型