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; 

}

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



为什么改动了之后,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表达式

    C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...

  2. C++11新特性(3) lambda表达式(1)

    C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...

  3. C++11 新特性:Lambda 表达式

    参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbits_lambda_expressions 或许,Lambda 表达式算得上是 C++ 1 ...

  4. c++11 新特性之lambda表达式

    写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...

  5. C++11新特性:Lambda函数(匿名函数)

    声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 ...

  6. C++11 新特性之 Lambda表达式

    lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体} []内的參数指的是Lambda表 ...

  7. [转载] C++11新特性

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

  8. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  9. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

随机推荐

  1. 求一个int型整数的两种递减数之和(华为2015笔试题及答案)

    给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同 ...

  2. Continue

    Continue 其作用为结束本次循环.即跳出循环体中下面尚未执行的语句. 对于while循环,继续求解循环条件. 对于for循环程序流程接着求解for语句头中的第三个部分expression表达式. ...

  3. s3c6410学习笔记-烧写uboot+构建文件系统

    一.进入目录 #cd u-boot-1.1.6_sndk6410 二.SD卡 make clean make distclean vim Makefile                       ...

  4. Entity Framework 数据部分更新之Attach &&Detach

    我们经常会遇到这样的问题:Update一个entity的部分数据时,通常需要new一个新的对象,然后事这新的对象Attach到Context中,代码如下所示: /// <summary> ...

  5. php面向对象编程学习之高级特性

    前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习. 面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高 ...

  6. Linux LVM硬盘管理及LVM分区扩容

    LVM磁盘管理 一.LVM简介... 1 二. LVM基本术语... 2 三. 安装LVM... 3 四. 创建和管理LVM... 4 2. 创建PV.. 6 3. 创建VG.. 7 4. 创建LV. ...

  7. rsyslog masg和rawmsg的区别

    msg the MSG part of the message (aka "the message" ;)) message 的MSG 部分 rawmsg the message ...

  8. Unix/Linux环境C编程入门教程(1) Solaris 11 64bit环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装Solaris 11 64位并且配置好C/C++开发环境 本文所 ...

  9. python setattr(),getattr()函数

    setattr(object,name,value): 作用:设置object的名称为name(type:string)的属性的属性值为value,属性name可以是已存在属性也可以是新属性. get ...

  10. MySQL数据处理函数

    数据处理函数 有时从数据库表中获取到的数据须要进行一些处理. 如将小写字母替换为对应的大写字母.这个处理过程能够在客户机上进行.也能够在数据库上进行. 数据库上进行会更高效.数据库中有对应的数据处理函 ...