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. html---id,name和value

    id是唯一标识符,不允许有重复值(类似数据表的主键,pk),可以通过它的值来获得对应的html标签对象.(如果在同一页面代码中,出现重复的id,会导致不可预料的错误) js代码可通过document. ...

  2. 武汉新芯:已建成IP体系,欲以存储器为特色

    武汉新芯集成电路制造公司(XMC)是地方政府投资的半导体企业,2006年由湖北省.武汉市.武汉市东湖高新区投资,并由东湖高新区管理的全资国有企业,前几年委托SMIC(中芯国际)经营管理,从2012年底 ...

  3. poj2000---和1969一样的模板

    #include <stdio.h> #include <stdlib.h> int main() { int d; while(scanf("%d",&a ...

  4. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  5. docker private registry使用

    一.搭建harbor: 步骤:略 二.命令行操作: 登录:docker login docker01 tag image: tag 一个 image,名称一定要标准( registryAddress[ ...

  6. 什么是CTS、CLS和CLR

    CTS.CLS和CLR是.NET框架的基本概念,但往往成为程序员们忽视的部分.清楚理解三者的概念,有助于.NET程序员编写高效安全的.NET程序. 所涉及到的知识点 •   .NET的基本概念 •   ...

  7. 如何在eclipse中修改jsp默认编码

    在使用eclipse编程的时候,很多默认的编码都是iso-8859-1我们经常使用的,在eclipse中怎么修改jsp页面的默认编码呢. 第一步:打开eclipse,找到windows-->pr ...

  8. My97DaePicker 用js实现文本框日期相减求天数

    <tr>                <td align="center" style="background-color: #cccccc;font ...

  9. .aspx.cs传值与取值

    1:.aspx中post传值 $.post("ABP_ExchangeRatelz.aspx", { option: "isdelete", Ori_Curre ...

  10. java 正则表达式抽取

    package com.achun.test; import java.util.regex.Matcher;import java.util.regex.Pattern; public class ...