C++ —— Lambda 表达式

在这里插入图片描述
在这里插入图片描述

🎁个人主页:工藤新一¹

🔍系列专栏:C++面向对象(类和对象篇)

🌟心中的天空之城,终会照亮我前方的路

🎉欢迎大家点赞👍评论📝收藏⭐文章


文章目录

  • Lambda
    • 一、Lambda表达式语法
    • 二、Lambda 表达式的应用
    • 三、捕捉列表
      • 3.1概念与功能描述
      • 3.2mutable
    • 四、Lambda 的原理
    • 五、Lambda 捕获悬垂引用问题

Lambda

一、Lambda表达式语法

lambda 表达式本质是一个匿名函数对象,跟普通函数不同的是他可以定义在函数内部。lambda 表达式语法使用层而言没有类型,所以我们⼀般是⽤ auto 或者模板参数定义的对象去接收 lambda 对象

  • lambda 表达式特点:轻量级
  • 快速定义一个匿名函数对象(也被称作:CLosure 闭包

lambda 表达式的格式:[capatrue-list](parameters)-> return type { function body }

  • [capatrue-list]: 捕捉列表,该列表总是出现在 [lambda] 函数的开始位置,编译器根据 [] 来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下文中的变量 供 lambda 函数使用,捕捉列表可以传值和传引用捕捉(注意:即使捕捉列表为空也不能被省略)

  • (parameters): 参数列表,与普通函数的参数列表功能类似,如果不需要参数传递,那么即可连同 () 一起省略

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

  • { function body }: 函数体,函数体内的实现跟普通函数完全类似,在该函数体内,除了使用其参数外,还可使用所有捕获到的变量,函数体为空时也不能被省略。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


二、Lambda 表达式的应用

​ 在学习 lambda 表达式之前,我们的使⽤的可调⽤对象只有 函数指针仿函数对象,函数指针的类型定义起来⽐较⿇烦,仿函数要定义⼀个类,相对会⽐较⿇烦。使用 lambda 去定义可调⽤对象,既简单又方便

lambda 在很多其他地⽅⽤起来也很好⽤,⽐如 线程 中定义线程的执⾏函数逻辑,智能指针 中定制 删除器 等,lambda 的应⽤还是很⼴泛的,以后我们会不断接触到

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


三、捕捉列表

3.1概念与功能描述

lambda 表达式中默认只能用 lambda 函数体和参数中的变量,如果想运⽤外层作⽤域中的变量则需要进行 “捕捉”

  • 第一种捕捉方式:在捕获列表中显示 传值捕获(变量只读状态)传引用捕获,捕获多个变量用逗号进行分割。[ x, y, &z ] 表示 xy 值捕获,z 引用捕获
  • 第⼆种捕捉方式:在捕捉列表中隐式捕捉,在捕捉列表写⼀个 = 表⽰隐式值捕捉(将变量全部变为值捕捉),在捕捉列表 写⼀个 & 表⽰隐式引用捕捉,这样我们 lambda 表达式中使用的那些变量,编译器就会对其进行⾃动捕捉

注意:隐式捕获,不是将程序中的所有变量都捕捉到 **lambda** 表达式中,而是需要哪个,捕获哪个

  • 第三种捕捉方式:在捕捉列表中混合使⽤隐式捕捉和显⽰捕捉, [ = , &x ] 表⽰其他变量隐式值捕捉, x 引⽤捕捉;[ &, x, y ] 表⽰其他变量引⽤捕捉,xy 值捕捉。当使⽤混合捕捉时,第⼀个元素必须是 & 或 =,并且 & 混合捕捉时,后⾯的捕捉变量必须是值捕捉,同理 = 混合捕捉时,后⾯的捕捉变量必须是引⽤捕捉。

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


  • lambda 表达式在函数局部域中,他可以捕捉 lambda 位置之前定义的变量,不能捕捉静态局部变量和全局变量,静态局部变量和全局变量也不需要捕捉,lambda 表达式中可以直接使用。这也意味着**lambda** 表达式如果定义在全局位置,捕获列表必须为空

在这里插入图片描述


3.2mutable

  • 默认情况下, lambda 捕捉列表是被 const 修饰的,也就是说传值捕捉而来的对象不能被修改,mutable 加在参数列表的后⾯可以 取消其常量性,也就说使⽤该修饰符后,传值捕捉的对象就可以被修改了,但是修改还是形参对象,不会影响实参(类似值传递,返回的是自身数据的一份临时拷贝)— — 被 lambda 通过 “传值捕获” 的内部变量,本质是外部变量的一份临时拷贝。使用 mutable 修饰符后,参数列表不可省略(即使参数不能为空)。

在这里插入图片描述


四、Lambda 的原理

lambda 的原理和 范围for 很像,编译后从汇编指令层的⻆度看,压根就没有 lambda范围for 这样的东西。范围for 底层是迭代器,⽽lambda 底层是仿函数对象,也就说我们写了⼀个 lambda 以后,编译器会⽣成⼀个对应的仿函数的类

​ 仿函数的类名是编译按⼀定规则⽣成的,保证不同的 lambda ⽣成的类名不同,lambda 参数/返 回类型/函数体就是仿函数 operator() 的参数/返回类型/函数体, lambda 的捕获列表本质是⽣成 的仿函数类的成员变量,也就是说捕获列表的变量都是 lambda 类构造函数的实参,当然隐式捕获,编译器要看使⽤哪些就传那些对象

  • 上⾯的原理,我们可以透过 汇编层 了解⼀下
class Rate
{
public:Rate(double rate): rate(rate) {}double operator()(double money, int year){return money * rate * year;}private:double rate;
};int main()
{double rate = 0.49;//仿函数对象Rate r1(rate);r1(1000, 2);auto func1 = [](){cout << "Hello World" << endl;}; func1();//lambda//捕获列表中的rate,可以视作 lambda 类构造函数的参数传递auto r2 = [rate](double money, int year){return money * rate * year;};r2(1000, 2);return 0;
}

在这里插入图片描述


  • 本质上都是给构造函数传参

在这里插入图片描述


在这里插入图片描述


  • 定义 lambda - 生成仿函数

  • 定义 lambda 对象 - 初始化仿函数对象

在这里插入图片描述


五、Lambda 捕获悬垂引用问题

在这里插入图片描述

此外,多线程中如果 捕获引用,也可能出现 引用失效 的问题,这会导致程序结果错误或访问异常等;而对于 传值捕获 则不会出现这种问题


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

🌟 各位看官好我是工藤新一¹呀~

🌈 愿各位心中所想,终有所致!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十三、面向对象底层逻辑-Dubbo序列化Serialization接口

一、引言&#xff1a;分布式通信的数据桥梁 在分布式服务调用中&#xff0c;参数的跨网络传输需要将对象转化为二进制流&#xff0c;这一过程直接影响系统的性能、兼容性与安全性。Dubbo通过Serialization接口构建了可扩展的序列化体系&#xff0c;支持多种序列化协议的无缝切…

批量剪辑 + 矩阵分发 + 数字人分身源码搭建全技术解析,支持OEM

在互联网内容生态蓬勃发展的当下&#xff0c;企业与创作者对内容生产与传播效率的要求日益增长。批量剪辑、矩阵分发和数字人分身技术的融合&#xff0c;成为提升内容创作与运营效能的关键方案。从源码层面实现三者的搭建与整合&#xff0c;需要深入理解各功能技术原理&#xf…

Java List 接口知识点详解

一、List 接口概述 1. 基本定义 继承关系&#xff1a;List 是 Java 集合框架&#xff08;Collection Framework&#xff09;中的一个有序队列接口&#xff0c;直接继承自 Collection 接口。核心特性&#xff1a; 有序性&#xff1a;元素按插入顺序存储&#xff0c;可通过索引…

OpenCV-去噪效果和评估指标方法

实验前言 噪音类型 opencv常见噪音类型有 高斯噪音&#xff1a;高斯噪音是一种随机噪音&#xff0c;其数值服从正态分布。图像受到高斯噪音的影响时&#xff0c;像素值的变化类似于白噪音&#xff0c;但是噪音的强度会随像素值的变化而变化。 椒盐噪音&#xff1a;椒盐噪音是…

永磁同步电机公式总结【一】——反电动势、磁链、转矩公式;三项、两项电压方程;坐标表换方程

一、PMSM 电机参数介绍 1.1 转子极数 转子极数 (Rotor Poles) &#xff1a;三相交流电机每组线圈都会产生 N、S 磁极&#xff0c;每个电机每相含有的永磁体磁极个数就是极数。由于磁极是成对出现的&#xff0c;所以电机有 2、4、6、8……极 (偶数)。 未知参数的电机&#xff…

eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点

一、eMMC 技术深度解析 1.定义与背景 eMMC&#xff08;Embedded Multi Media Card&#xff09;是一种专为嵌入式系统设计的非易失性存储解决方案&#xff0c;它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA&#xff08;Ball Grid Array&#xff09;封装中。其核心目标是简…

常见提示词攻击方法和防御手段——提示词越狱

提示词越狱&#xff08;Prompt Jailbreaking&#xff09;是一种针对大型语言模型&#xff08;LLM&#xff09;的攻击手段&#xff0c;旨在通过精心设计的输入提示绕过模型的安全审查和伦理限制&#xff0c;使其生成原本被禁止的内容&#xff08;如暴力、非法操作、敏感信息等&a…

MySQL之基础事务和隔离级别

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

学习记录:DAY29

项目开发日志&#xff1a;技术实践与成长之路 前言 回顾这几天的状态&#xff0c;热情总是比我想象中更快被消耗完。比起茫然徘徊的小丑&#xff0c;我更希望自己是对着风车冲锋的疯子。 今天继续深入项目的实际业务。 状态好点的时候&#xff0c;再看自己EMO时写的东西&…

kotlin Android AccessibilityService 无障碍入门

安卓的无障碍模式可以很好的进行自动化操作以帮助视障人士自动化完成一些任务。 无障碍可以做到&#xff0c;监听屏幕变化&#xff0c;朗读文本&#xff0c;定位以及操作控件等。 以下从配置到代码依次进行无障碍设置与教程。 一、配置 AndroidManifest.xml 无障碍是个服务…

【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应

目录 引言 一、watch侦听器&#xff08;监视器&#xff09; 1.作用&#xff1a; 2.语法&#xff1a; 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 &#x1f4ac; 欢迎讨论&#…

WPS中代码段的识别方法及JS宏实现

在WPS中&#xff0c;文档的基本结构可以通过对象模型来理解&#xff1a; &#xff08;1&#xff09;Document对象&#xff1a;表示整个文档 &#xff08;2&#xff09;Range对象&#xff1a;表示文档中的一段连续区域&#xff0c;可以是一个字符、一个句子或整个文档 &#…

el-tree结合el-tree-transfer实现穿梭框里展示树形数据

参考文章&#xff1a;我把他的弹框单拉出来一个独立文件作为组件方便使用&#xff0c;遇到一些问题记录一下。 testComponet.vue <template><div class"per_container"><div class"per_con_left"><div class"per_con_title&q…

Go 后端中双 token 的实现模板

下面是一个典型的 Go 后端双 Token 认证机制 实现模板&#xff0c;使用 Gin 框架 JWT Redis&#xff0c;结构清晰、可拓展&#xff0c;适合实战开发。 项目结构建议 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 从请求…

Typescript学习教程,从入门到精通,TypeScript 对象语法知识点及案例代码(7)

TypeScript 对象语法知识点及案例代码 TypeScript 是 JavaScript 的超集&#xff0c;提供了静态类型检查和其他增强功能。在 TypeScript 中&#xff0c;对象是面向对象编程&#xff08;OOP&#xff09;的基础。 一、对象概述 在 TypeScript 中&#xff0c;对象是属性的集合&a…

应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因

本文运用AI量化分析框架&#xff0c;结合市场情绪因子、宏观经济指标及技术面信号&#xff0c;对黄金与美元指数的联动关系进行解析&#xff0c;揭示本轮贵金属回调的深层驱动因素。 周三&#xff0c;现货黄金价格单日跌幅达2.1%&#xff0c;盘中触及3167.94美元/盎司关键价位&…

命令行登录 MySQL 报 Segmentation fault 故障解决

问题描述&#xff1a;对 mysql8.0.35 源码进行 make&#xff0c;由于一开始因为yum源问题少安装依赖库 库&#xff0c;在链接时遇到错误 undefined reference to&#xff0c;后来安装了相关依赖库&#xff0c;再次 make 成功。于是将 mysqld 启动&#xff0c;再用 mysql -u roo…

Axure设计数字乡村可视化大屏:构建乡村数据全景图

今天&#xff0c;让我们一同深入了解由Axure设计的数字乡村可视化大屏&#xff0c;看看它如何通过精心的布局和多样化的图表类型&#xff0c;将乡村的各类数据以直观、易懂的方式呈现出来&#xff0c;为乡村管理者提供有力的数据支持。 原型效果预览链接&#xff1a;Axure数字乡…

3D个人简历网站 4.小岛

1.模型素材 在Sketchfab上下载狐狸岛模型&#xff0c;然后转换为素材资源asset&#xff0c;嫌麻烦直接在网盘链接下载素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…

智能开发工具PhpStorm v2025.1——增强AI辅助编码功能

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…