隐式捕获:

出了显式列出我们希望使用的来自函数的变量外,还可以让编译器根据lambda体中的代码来推断我们要使用哪些变量。为了指示编译器推断捕获列表,应在捕获列表中写一个&或=。&告诉编译器采用引用捕获方式,=告诉编译器采用值捕获方式。我们可以混合使用隐式或显式捕获,在此条件下,捕获列表的第一个元素必须是一个&或=。当混合使用隐式和显式捕获时,显式捕获的变量必须使用与隐式捕获不同的方式。即,如果隐式捕获时引用(&)方式,则显式捕获名变量必须使用值捕获方式,因此不能在显式捕获名字前使用&;如果是隐式捕获时值(=)方式,显式捕获变量名必须采用引用方式,即在名字前加&。

eg:

 #include<iostream>
using namespace std; int main()
{
/*隐式引用捕获*/
int ma = ;
int mma = ;
auto f= [&] {return ma+mma; };
ma = ;
cout << f() << endl; /*隐式值捕获*/
int a = ;
int aa = ;
auto ff = [=] {return a+aa; };
a = ;
cout << ff() << endl; /*混合捕获,引用在前*/
int i = ;
int j = ;
auto fff = [&,j] {return i+j; };
//auto fff = [&i, =] {return i + j; }; err
//auto fff = [&i, &] {return i + j; }; err
i = ;
cout << fff() << endl; /*混合捕获,值在前*/
int m = ;
int n = ;
auto ffff = [=, &n] {return m + n; };
n = ;
cout << ffff() << endl; /*混合捕获的思考,多个变量,可以隐式捕获,针对特殊变量,单独指定*/
int q = , w = , e = , r = ;
/*我想除了e变量,其余的都用值捕获*/
auto fffff = [=, &e] {return q+w+e+r; };
e = ;
cout << fffff() << endl;
return ;
}

可变lambda:

默认情况下,对于一个值拷贝的变量,lambda不会改变其值,如果我们希望能改变一个被捕获的变量的值,就必须在参数列表后加上mutable。因此,可变lambda能省略参数列表。

 #include<iostream>
using namespace std; int main()
{
int ma = ;
auto f= [=] ()mutable {return ++ma; };
cout << f() << endl;
return ;
}

一个引用捕获能否改变变量的值依赖于此引用指向的是一个const类型还是一个非const类型。

指定lambda返回类型:

默认情况下,如果lambda体包含return之外的任何语句,则编译器假定此lambda返回void。与其他返回void的函数类似,被推断返回void的lambda不能返回值。

 #include<iostream>
using namespace std; int main()
{
auto f = [](int* a)->int * { if (*a > )return a; else return NULL; };
cout << f(NULL) << endl;
return ;
}

不用位置返回类型将报错。但是如果返回类型都是一种类型,比如上诉两个return,都return一种类型,是可以推断的,但是吐过return类型不同,将要使用尾置返回类型强制指定,在不止单纯一条return语句时,建议最好使用尾置返回类型。

对于那种只在一两个地方使用的简单操作,lambda表达式是很有用的。但如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式。类似的,如果一个操作需要很多语句完成,通常使用函数更好。如果一个lambda捕获列表为空,通常可以用函数来代替它。但是对于捕获局部变量的lambda,用函数替代就不那么容易了。

lambda续集——2的更多相关文章

  1. lambda续集——1

    捕获列表,只用于局部非static变量,lambda可以直接使用局部static变量和它所在函数之外声明的名字. eg: #include<iostream> using namespac ...

  2. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  3. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  4. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  5. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  6. Lambda

    Lambda Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LI ...

  7. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  8. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  9. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

随机推荐

  1. 基础url、相对url、绝对url

    #基础url.相对url.绝对url #HTTP权威指南 34页 •绝对URL:包含了访问资源所需的全部信息,如:http://www.163.com/new.html •相对URL:去除基础的部分, ...

  2. http 事务

    #事务#HTTP权威指南 9页一个事务由一条请求命令和一个响应结果组成.这种通信是通过名叫HTTP报文(http message)的格式化数据块进行的

  3. set names utf8 【mysql导入中文乱码问题解决】

    由于工作的关系需要经常导入一些sql脚本,但是经常会遇到导入中文出现乱码的问题,搞得自己每次导入sql脚本时都很害怕,自己也上网找了一些资料,尝 试了许多办法,有些方法可以正常导入中文,有些办法却不行 ...

  4. MySQL Desc指令相关

    MySQL Desc指令相关   2011-08-09 11:25:50|  分类: my基本命令 |举报 |字号 订阅 1.desc tablename; 例如 :mysql> desc jo ...

  5. SpringBoot之自定义验证码

    代码地址如下:http://www.demodashi.com/demo/14280.html 项目介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控 ...

  6. 【LeetCode】150. Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  7. vi/vim 计算搜寻关键字数量

    http://hi.baidu.com/xletian/blog/item/f19962061a9a506c020881dc.html 在看过 vim 的全域指令和 search 指令之後,你会不会也 ...

  8. python练习笔记——丑数的计算

    只包含因子2,3,5的正整数被称作丑数,比如4,10,12都是丑数,而7,23,111则不是丑数,另外1也不是丑数.——摘自百度百科 get_num = int(input("请您输入丑数的 ...

  9. regular expression 练习

    练习有一个文件,文件名为output_1981.10.21.txt .下面使用Python: 读取文件名中的日期时间信息,并找出这一天是周几.将文件改名为output_YYYY-MM-DD-W.txt ...

  10. java concurrent之ReentrantLock

    在编码的过程中.有时候我们不得不借助锁同步来保证线程安全.synchronizedkeyword在上一篇博客中已经介绍.自从JDK5開始,加入了还有一种锁机制:ReentrantLock. 二者的差别 ...