lambda()

  • lambda()语法
    • 捕捉列表
      • mutable
    • lambda 底层原理
      • 函数对象与lambda表达式

lambda()语法

lambda表达式书写格式:

[capture-list] (parameters) mutable -> return-type{ statement
}

咱们一个个来解释:
[capture-list] :捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。不能省略

(parameters): 参数列表,与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略

mutable: 默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。

-> return-type:返回值类型,用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

statement:函数体,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。不可省略

因此,把可以省略的都省略掉,最那简单的lambda函数是 []{} ,该 lambda 表达式没有任何意义。该lambda函数不能做任何事情。

接下来写一个lambda函数:

auto add = [](int x, int y)->int{return x + y;};

lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。
调用:

 //第一种add(10, 20);//第二种[](int x, int y)->int {return x + y;}(10, 20);

可以看出,lambda函数和普通函数在组成和调用上都很相似。参数列表,返回值,函数体都不在多叙述。

捕捉列表

捕捉列表描述了上下文中那些数据可以被lambda使用。

如:

    int a = 10;int b = 20;auto add = [a,b]() {return a + b ;};

直接捕捉了 a b 变量,且是传值捕捉,lambda函数体内的a, b变量,只是外边 a b 的一份拷贝。且默认无法修改。

要想修改,可以使用 mutable 进行修饰。

mutable

如:

auto add = [a, b]() mutable{a = 20;return a + b;};

就不会报错,但因为是传值,所以lambda 函数内部 a的变化,无法影响外部的a变量。

mutable 用的比较少。

当然,lambda函数 和普通函数一样,捕捉列表,可以传值捕捉,也可以传引用捕捉。

    int x = 10;int y = 20;//捕捉列表//传引用   参数列表auto fun1 = [](int& x, int& y) {int tmp = x;x = y;y = x;};// 传引用捕捉   auto fun2 = [&x,&y]() {int tmp = x;x = y;y = x;};//对上下文所有变量进行传引用捕捉auto fun3 = [&]() {x = y;};//对除y以外的所有变量传引用捕捉,y传值捕捉auto fun4 = [&, y] {;};//对y进行传值捕捉,对其余变量进行传引用捕捉auto fun5 = [=, &y] {;};

lambda 底层原理

看如下代码:

int main()
{int a = 10;int b = 20;auto add = [a, b]() mutable{a = 20;return a + b;};cout << typeid(add).name() << endl;cout << sizeof(add) << endl;return 0;
}

lambda 函数的类型变量是什么呢?
lambda 类型的大小又是多少呢?

从运行结果上来看,其大小为一,类型大致为一个类,具体是什么我们现在也不清楚。

函数对象与lambda表达式

函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。

//仿函数
class math {public:int operator() (int x, int y){return x + y;}
};int main()
{int a = 10;int b = 20;//仿函数对象math m;//lambda函数auto add = [](int a,int b) {return a + b;};m(a, b);add(a, b);return 0;
}

我们从反汇编上来看,
仿函数底层代码,调用了 重载的 ()

lambda() 函数的底层:

我们也可以看出,也是调用了一个lambda 类里的重载的()

不妨看出,lambda()函数的底层就是一个重载了()的空类。

所以就可以知道,lambda类型的大小为1了:

因为,它的底层是一个空类,是一个仿函数。

至于它的类型,如图:

也就是,上图是 lambda_UUID
UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是通过一种特殊的算法计算出来的具有唯一识别信息的 数据。

也就是说,每一个lambda()对象的类型都不一样。
也就不存在不同lambda()对象相互赋值的情况。

结语
本次的博客就到这了。

我是Tom-猫,
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。

咱们下期再见。

【lambda函数】lambda()函数相关推荐

  1. Java箭头函数,lambda函数

    Java箭头函数,lambda函数 lambda表达式实质就是一种语法糖,(建议尽量不要使用lambda表达式,代码太简洁,难懂,难以调试) lambda表达式的简单例子: 不需要参数,返回5 ()- ...

  2. 高阶函数-lambda表达式

    #2.6 map()# 第一个参数传入一个函数,,第二个参数为一个可迭代对象li_1 = (1,3,5,7)def funcA(x): return x*xm1 = map(funcA,li_1)pr ...

  3. python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)

    python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...

  4. C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...

  5. 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计

    目录 文章目录 目录 前文列表 函数 Lambda 表达式 函数设计 函数的存储 实现 Lambda 函数 函数的运行环境 函数调用 可变长的函数参数 源代码 前文列表 <用 C 语言开发一门编 ...

  6. 《Python数据科学指南》——1.16 使用lambda创造匿名函数

    本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.16节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...

  7. python-匿名函数lambda

    python-匿名函数lambda 有些时候,我们在传入函数时,不需要显示的定义函数,直接传入匿名函数更方便.在python中,对匿名函数提供了有限支持.以map()函数为例,计算f() = x2,使 ...

  8. Java8学习系列之匿名函数Lambda

    Lambda介绍 Lambda,别名函数式编程,维基百科给出以下介绍: 函数式编程是一种编程范式.它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据.它是一种声明式的编程范式,通过表达式和声 ...

  9. Python编程基础:第五十三节 匿名函数Lambda Function

    第五十三节 匿名函数Lambda Function 前言 实践 前言 匿名函数是一种非常优雅的表达方式,它可以将函数定义用一行代码进行表示.其书写方式为参数列表:函数实现,其中多个参数之间用逗号隔开, ...

  10. Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略

    Python语言学习之lambda:lambda函数的简介.使用方法.案例大全之详细攻略 目录 lambda函数的简介 1.lambda匿名函数的格式 2.lambda函数特点 3.lambda函数与 ...

最新文章

  1. Google Mock(Gmock)简单使用和源码分析——源码分析
  2. DPDK KNI实现(二十五)
  3. nginx php跳转url参数,NGINX 中把url中的内容当初参数处理
  4. Spring + JDK Timer Scheduler Example--reference
  5. 你在第几楼?80后、90后扎心图鉴
  6. 机器学习之贝叶斯垃圾邮件分类
  7. 实际的Reactor操作–检索Cloud Foundry应用程序的详细信息
  8. jquery获取radio的值,a标签传值
  9. dataset__getitem___【小白学PyTorch】3.浅谈Dataset和Dataloader
  10. 不重复数字(洛谷 P4305)
  11. springboot controller 分页查询_Spring Boot实战分页查询附近的人: Redis+GeoHash+Lua
  12. 【没有assembly目录】spark2.0.0启动时无法访问spark-assembly-*.jar的解决办法
  13. 如何把java控件添加代码_JAVA 添加控件问题 代码如下 很简单的一个程序 在线等 Thanks...
  14. AndroidSDK和ADT下载地址
  15. AI智能尺寸测量仪简介(图像尺寸测量仪)
  16. java生成数字字母组合_java生成随机数字和字母组合
  17. 云短信使用——阿里云短信使用步骤
  18. 使用Datadog在docker环境下监控Java, Tomcat, Nginx, Kfaka, ZooKeeper
  19. glide 加载图片宽度填满,高度自适应图片比列
  20. DB 查询分析器 方便地创建DB2自定义函数

热门文章

  1. win7怎么设置路由器连接到服务器未响应,路由器连接不上Win7系统电脑的解决方法...
  2. 从100套真题中提炼而出的100百个经典句子
  3. 华为OD机试真题 C++ 实现【删除重复数字后的最大数字】【100%通过率】【2022.11 Q4 新题】
  4. 银行数字化转型的技术展望
  5. 不是机器人韩剧所有歌曲_不是机器人主题曲、插曲、片尾曲OST歌曲歌词
  6. C语言是终极王者,【独家】数竞决赛大比拼,谁才是终极王者?
  7. 如何关闭联想杀毒Plus
  8. 自定义View、画波浪线
  9. 全民小视频视频搬运伪原创
  10. win10下打开.hlp文件真正简单解决方法?