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; 
}
结果:


为什么改动了之后,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捕捉块的介绍就到这里了.







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5200680.html,如需转载请自行联系原作者

相关文章
|
29天前
|
设计模式 安全 算法
【C++ 基础】超越边界:C++中真正不受访问修饰符限制的特性
【C++ 基础】超越边界:C++中真正不受访问修饰符限制的特性
36 0
|
29天前
|
设计模式 存储 缓存
【C++ 基本概念】深入探索C++ RTTI 特性
【C++ 基本概念】深入探索C++ RTTI 特性
61 0
|
28天前
|
自然语言处理 编译器 C语言
【C++ 20 新特性】参数包初始化捕获的魅力 (“pack init-capture“ in C++20: A Deep Dive)
【C++ 20 新特性】参数包初始化捕获的魅力 (“pack init-capture“ in C++20: A Deep Dive)
38 0
|
28天前
|
Linux C++ iOS开发
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(二)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
244 2
|
28天前
|
Linux API C++
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南(一)
【C++ 17 新特性 文件管理】探索C++ Filesystem库:文件和目录操作的全面指南
306 2
|
13天前
|
编译器 C语言 C++
C++ lambda表达式
C++ lambda表达式
|
24天前
|
存储 安全 编译器
【C++】类的六大默认成员函数及其特性(万字详解)
【C++】类的六大默认成员函数及其特性(万字详解)
35 3
|
27天前
|
算法 安全 编译器
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
【C++ 17 新特性 折叠表达式 fold expressions】理解学习 C++ 17 折叠表达式 的用法
23 1
|
1天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
9 0
|
1天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
8 0

热门文章

最新文章