1. Lambda 的语法形式如下:
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

可以看到,Lambda 主要分为五个部分:[函数对象参数]、(操作符重载函数参数)、mutable 或 exception 声明、-> 返回值类型、{函数体}.

示例:

[] (int x, int y) { return x + y; } // 隐式返回类型
[] (int& x) { ++x;  } // 没有 return 语句 -> Lambda 函数的返回类型是 'void'
[] () { ++global_x;  } // 没有参数,仅访问某个全局变量
[] { ++global_x; } // 与上一个相同,省略了 (操作符重载函数参数)
2. Lambda 函数可以引用在它之外声明的变量.

这些变量的集合叫做一个闭包. 闭包被定义在 Lambda 表达式声明中的方括
号 [] 内。这个机制允许这些变量被按值或按引用捕获。如下图的例子:
[] // 为定义变量,试图在lambda内使用任何外部变量都是错的
[&] // 用到的任何外部变量都是隐式按引用捕获
[=] // 用到的任何外部变量都是隐式按值捕获

(操作符重载函数参数)

标识重载的 () 操作符的参数,没有参数时,这部分可以省略。参数可以通过按值(如: (a, b))和按引用 (如: (&a, &b)) 两种
方式进行传递。

3. mutable 或 exception 声明

这部分可以省略。按值传递函数对象参数时,加上 mutable 修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是
值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。

4. -> 返回值类型

标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)
时,这部分可以省略。

5 . {函数体}

标识函数的实现,这部分不能省略,但函数体可以为空。
示例 1

std::vector<int> some_list;
int total = 0;
for (int i = 0; i < 5; ++i) some_list.push_back(i);
std::for_each(begin(some_list), end(some_list), [&total](int x)
{total += x;
});

此例计算 list 中所有元素的总和。变量 total 被存为 Lambda 函数闭包的一部分。因为它是栈变量(局部变量)total 引
用,所以可以改变它的值。

示例 2

std::vector<int> some_list;
int total = 0;
int value = 5;
std::for_each(begin(some_list), end(some_list), [&, value, this](int x)
{total += x * value * this->some_func();
});

此例中 total 会存为引用, value 则会存一份值拷贝。对 this 的捕获比较特殊,它只能按值捕获。this 只有当包含它的最靠近
它的函数不是静态成员函数时才能被捕获。对 protect 和 private 成员来说,这个 Lambda 函数与创建它的成员函数有相同
的访问控制。如果 this 被捕获了,不管是显式还是隐式的,那么它的类的作用域对 Lambda 函数就是可见的。访问 this 的
成员不必使用 this-> 语法,可以直接访问。

6.总结:

不同编译器的具体实现可以有所不同,但期望的结果是: 按引用捕获的任何变量,Lambda 函数实际存储的应该是这些变量在创建这个 Lambda 函数的函数的栈指针,而不是 Lambda 函数本身栈变量的引用。不管怎样,因为大多数 Lambda 函数都很小且在局部作用中,与候选的内联函数很类似,所以按引用捕获的那些变量不需要额外的存储空间。

如果一个闭包含有局部变量的引用,在超出创建它的作用域之外的地方被使用的话,这种行为是未定义的!

Lambda 函数是一个依赖于实现的函数对象类型,这个类型的名字只有编译器知道. 如果用户想把 lambda 函数做为一个参数来传递, 那么形参的类型必须是模板类型或者必须能创建一个 std::function 类似的对象去捕获 lambda 函数.使用 auto 关键字
可以帮助存储 lambda 函数,

Lambda 的语法相关推荐

  1. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

  2. lambda表达式语法_使用类似Lambda的语法作为Java中的表达式进行切换

    lambda表达式语法 从Java 14开始, switch表达式具有其他Lambda式 ( case ... -> labels )语法,它不仅可以用作语句,还可以用作计算为单个值的表达式. ...

  3. 使用类似Lambda的语法切换为Java中的表达式

    从Java 14开始, switch表达式具有额外的Lambda式 ( case ... -> labels )语法,它不仅可以用作语句,还可以用作计算为单个值的表达式. 使用新的类似Lambd ...

  4. Lambda表达式语法及应用

    前言: JDK8后,源码中开始应用Lambda表达式,所以如果想读懂源码的同学学习它是绕不过去的,至于lambda表达式在不在开发中使用,就要看自己的需求啦,他的优点很明显,简洁,非常容易并行计算,提 ...

  5. Lambda(语法+使用)

    Lambda语法特性 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号. 可选的大括号:如果主体包含了一个语句,就不需要 ...

  6. Java 8 之lambda表达式语法

    1. 简介 lambda表达式可以这样定义(不精确,自己的理解):一段带有输入参数的可执行语句块. //这里省略list的构造 List<String> names = ...; Coll ...

  7. Lambda基本语法及使用

    Lambda 概述 lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例 ...

  8. Lambda表达式语法 (二)

    1. Stream体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggr ...

  9. Java8 Lambda表达式语法和示例

    本文是对官方文档(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html)的概括总结,更详细的内容请看官方 ...

最新文章

  1. python二级考试试题4答案_第4卷讲解Python语言计算机等级考试二级操作题
  2. 动图|帮你一次性搞清楚 40种传感器工作原理
  3. 算法学习--Day3
  4. 雄迈400万TF卡内核补丁
  5. UI5 Navigation execution entry point
  6. python王者归来 pdf_OpenStack开源云:王者归来 PDF 下载
  7. 以下不属于时序逻辑电路的有_电工电子技术(不建议浪费时间学习的科目)
  8. 【HNOI2004】L语言
  9. python 目标检测 训练_YOLOv3目标检测有了TensorFlow实现,可用自己的数据来训练
  10. TX2开发板Ubuntu16.04设置静态IP
  11. Atitit.跨语言标准化 web cgi api v2 saa CGI   (通用网关接口)  编辑 CGI 是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CG
  12. 全地形机器人HEXA评测:不做玩具 钻洞爬台阶可编程 | 评测
  13. 第三次作业(尤心心)
  14. Pygame实战:这款“欢乐打地鼠”小游戏让几亿人“上瘾“?不玩绝对是你的损失。
  15. 这个Python自动扫雷算法写完了,估计看懂的人十不存一了吧
  16. 使用网上成熟的【MySqlBackup】组件,通过WEB网页操作,备份远程计算机中的数据库到C:\inetpub\wwwroot文件夹下,系统汇报错误(访问被拒绝),该如何解决呢?
  17. python引流_Python初学者也可以秒懂的Python For循环思维
  18. 成为百万富翁的四个方法
  19. GSM手机卡头不安全,可轻易复制来使用
  20. Unsupervised Monocular Depth Estimation From Light Field Image

热门文章

  1. 计算机科学与技术与智能化建筑建造论文,浅析智能建筑与智能化系统
  2. 【前端基础】整理常见的单位 px em rem % vw vh vmin vmax rpx
  3. 关于女孩子日记本的最新动态
  4. 心理成熟度 - 创业公司识人利器
  5. [原创]QQ农场外挂辅助制作一点心得体会1
  6. 怎么查看手机的信号质量
  7. 【电气专业知识问答】问:隔离开关的功能及构造特点是什么?
  8. SLAM实操入门(七):使用Velodyne16线激光雷达与A-Loam进行三维SLAM
  9. 第03章 Python的数据结构、函数和文件
  10. 翻译君Mobx,Ten minute introduction to MobX and React