码迷,mamicode.com
首页 > 编程语言 > 详细

c++11新特性(4) lambda捕捉块

时间:2014-07-16 11:07:27      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:c++   c++11   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; 
}

结果

bubuko.com,布布扣

可以看到,未被捕获的变量不能在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; 
}
结果:
bubuko.com,布布扣

先来看看上一节中关于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; 
}
结果:
bubuko.com,布布扣

为什么修改了之后,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; 

}

bubuko.com,布布扣

可以看到,只有通过引用捕获,才能修改外部变量的值!
关于lambda捕捉块的介绍就到这里了.

c++11新特性(4) lambda捕捉块,布布扣,bubuko.com

c++11新特性(4) lambda捕捉块

标签:c++   c++11   lambda   

原文地址:http://blog.csdn.net/qq844352155/article/details/37812253

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!