c++11新特性(4) lambda捕捉块
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捕捉块的更多相关文章
- C++11新特性之一——Lambda表达式
C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...
- C++11新特性(3) lambda表达式(1)
C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...
- C++11 新特性:Lambda 表达式
参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbits_lambda_expressions 或许,Lambda 表达式算得上是 C++ 1 ...
- c++11 新特性之lambda表达式
写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...
- C++11新特性:Lambda函数(匿名函数)
声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 ...
- C++11 新特性之 Lambda表达式
lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体} []内的參数指的是Lambda表 ...
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
随机推荐
- Eclipse --Type /com.xx.app/gen already exists but is not a source folde解决方案
两种解决方案: Two actions, first: 1.Right click on the project and go to "Properties" 2.Select & ...
- GMTED2010 高程数据下载
http://topotools.cr.usgs.gov/GMTED_viewer/viewer.htm
- c# 多显示器设置主屏幕(Set primary screen for multiple monitors)
原文 http://www.cnblogs.com/coolkiss/archive/2013/09/18/3328854.html 经过google加各种百度,终于找到了一个有效的解决方案,下面是两 ...
- cdoj 斐波那契进制
//昨天在姜神的提醒下发现这种方法可以解决升级版的 非升级版直接01背包就好 //这题脑洞开得真是够大 解:大概要先把数分解成斐波拉契进制,x=f1*(0或1)+f2*(0或1)+...+fn*(0或 ...
- 使用my97datepicker控件实现日期范围选择
注:(2014-12-05内容修改:添加运行效果) 使用my97datepicker 控件,需要对日期的范围进行控制,本人自己写了一个js完成此功能,示例为当前日期到下一周周五之间的日期可选,其他日期 ...
- C#反射动态赋值
很多时候我们需要在数据实体层读取数据后赋值到领域模型时往往会产生如下的代码 public class A { public string Name {get;set;} public int Age ...
- SGU 506.Subsequences Of Substrings
求一个串S有多少子串subS满足s是subS的子序列.len(S)<=100000, len(s)<=100 直接扫一遍... ------------------------------ ...
- 理解ROS的参数
记住每次操作之前都要在一个单独的终端中运行ros的核心. roscore rosparam命令允许你在ROS的参数服务器上操作和存储数据,参数服务器可以存储整数,浮点数,布尔类型,字典,列表.ROS使 ...
- C学习之结构体
结构体(struct) 结构体是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合,结构体中可以使用不同的数据类型. 1. 结构体说明和结构体变量定义 在Turbo C中, 结构体也是一种数据 ...
- HDU4323-Magic Number(levenshtein distance-编辑距离)
描述: There are many magic numbers whose lengths are less than 10. Given some queries, each contains a ...