lamda表达式

news2025/1/13 2:28:41

lamda表达式可以看作是一个匿名函数。编译器在编译的时候,会将lamda表达式处理成一个仿函数类,类名是类名是不重复的随机名称(因为一个作用域中可能存在多个仿函数),返回该仿函数的对象。

lamda既然可以看作是一个匿名函数,那就至少具备除函数名以外的两部分:返回值形参列表函数体

lamda表达式的书写格式

[capture-list](parameters)mutable->return-type{ statement }
/*
    [](const int x, const int y)mutable->int{
        return x + y;
    }
*/

目录

一、lamda表达式各部分说明 

1、capture-list(必要部分)

2、parameters(可选部分)

3、mutable(可选部分)

4、->return-type(可选部分)

5、 statement(必要部分)

二、lamda表达式的底层处理


一、lamda表达式各部分说明 

1、capture-list(必要部分)

(1) 捕获方式

capture-list表示捕获列表,lamda表达式可以通过捕获列表来获取上下文的变量,以供lamda表达式使用,无需通过形参列表传递变量。

捕获列表有两种方式来捕获变量:值传递、引用传递

捕获方式解释
[var]值传递的方式捕获变量 var,如[ a ],捕获上下文中的变量a
[=]值传递的方式捕获父作用域中的所有变量(包括this)
[&var]引用传递的方式捕获变量var
[&]引用传递的方式捕获父作用域中的所有变量(包括this)
[this]以值传递的方式捕获当前的this指针

(2) 注意事项

不能以相同的方式捕捉同一个变量。比如[=, a], = 表示以传值的方式捕捉所有的变量(包括变量a),a表示以传值的方式捕捉变量a,这个时候变量a以传值的方式被捕捉了两次

[=, a](){}        // 错误,重复捕获

不能捕捉父作用域之外的变量(包括全局变量)

int a = 10;
auto obj1 = []{};    // 注意,此时lamda表达式没有父作用域,捕获列表必须为空

int main()
{
    auto obj2 = [a]{};    // 错误,不可以捕获全局变量
}

 lamda表达式不能相互赋值。lamda表达式底层是被处理成一个类,不同的lamda表达式相当于不同的类(即便是类型相同也不行),不同的类之间不能相互赋值。

int main() {
	auto obj1 = [] {};
	auto obj2 = [] {};
	obj2 = obj1;        // 错误,obj1和obj2底层被处理成不同的类,他们的类名不可能重复
}

2、parameters(可选部分)

parameters表示调用lamda表达式时,要传递给lamda表达式的值。如果无需传递参数,该部分可以省略。

[]mutable->int{ return 0; };

3、mutable(可选部分)

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

[]()->int{ return 0; };

4、->return-type(可选部分)

return-type表示lamda表达式的返回值类型。无返回值时,可以省略;有返回值时,也可以省略,此时交由编译器推导。

[](){ return 0; };

5、 statement(必要部分)

statement表示函数体,在函数体中,可以使用形参列表,也可以使用所有捕获到的变量,函数体中的语句可以有多条。

int main()
{
    int a = 10;
    auto obj = [&a](const int x){
        int c = x - a;
        return c;
    };
    return 0;
}

二、lamda表达式的底层处理

以下面这个lamda表达式为例

int main() {
	auto obj1 = [] {};   
	obj1();

    cout << typeid(obj1).name() << endl;
}

由此可见,lamda表达式实际上是被处理成一个类,类名是 lamda_<uuid> ,这样保证了每个lamda表达式的唯一性。lamda表达式的返回值就是该类的对象

我们通过反汇编来看一下lamda表达式的调用过程,我们会发现,类lamda_<uuid> 中重载了operator(),这样就可以使用对象来调用lamda表达式了。

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

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

相关文章

文件操作(C语言)

目录 1、为什么使用文件 2、什么是文件 程序文件 数据文件 文件名 3、文件的打开和关闭 文件指针 文件的打开和关闭 4、文件的顺序读写 文件读写介绍 文件读写函数 fputc&#xff08;字符 输出/写 函数&#xff09; fgetc&#xff08;字符 输入/读 函数&#xff09; fputs&…

VMware Workstation安装:与 Device/Credential Guard 不兼容

VMware Workstation安装&#xff1a;与 Device/Credential Guard 不兼容 1、快速解决 安装最新版VMware Workstation&#xff0c;例如我安装的是VMware Workstation Pro 17&#xff1a; 是的&#xff0c;解决报错的办法&#xff0c;就是安装/升级VMware Workstation版本。 参…

Aspose.PDF 23.1.0 for .NET Crack

Aspose.PDF for .NET可以在 .NET 程序中生成、屏蔽、编辑甚至将 PDF 文件转换为多种格式&#xff0c;而无需依赖 Adob​​e Acrobat。它是.Net核心对PDF的创新处理&#xff0c;可以在跨平台软件中执行文档操作甚至任务管理。借助 API&#xff0c;用户可以创建、更改、呈现、保护…

Spring Cloud:网关Gateway

✨ Spring Cloud:网关Gateway微服务网关概述为什么需要微服务网关服务网关的介绍Getway基本介绍微服务架构中网关所处位置三大核心概念工作流程入门案例搭建新建模块**cloud-gateway-gateway9527**导入依赖application.yml主启动类实现动态路由测试Predicate 断言基本介绍Route…

详解信奥一本通1290:采药

1290&#xff1a;采药【题目描述】辰辰是个很有潜能、天资聪颖的孩子&#xff0c;他的梦想是称为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说&#xff1…

Fisco Bcos区块链三(webase中间件平台一键部署)

文章目录区块链开荒技术文档&#xff1a;https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html4. Webase一键部署Java环境变量配置MySQL安装Ubuntu安装mysql数据库安装后设置密码&#xff1a;Python部署PyMySQL部署&#xff08;Python3.6&#xff09;拉取…

SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)

目录 概述 前端编写 页面展示 后端编写 编写接口 过滤器的编写 过滤器功能实验 概述 解决需求&#xff1a;在用户未登录的情况下访问未登录不可访问的页面时&#xff0c;请求将被过滤到&#xff0c;将用户退回登录页面。 技术选型 前端&#xff1a;Vue ElementUI 后端…

MySQL事务的四大特性以及并发事务问题

事务的四大特性ACID 【原子性&#xff08;Atomicity&#xff09;】&#xff1a;事务是不可分割的最小单元&#xff0c;要么全部成功&#xff0c;要么全部失败。&#xff08;eg&#xff1a;转账案例&#xff0c;转账过程中任何一步操作失败了&#xff0c;那么整个事务就失败了&a…

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器&#xff08;Decorator&#xff09;是 Python 中一种函数或类&#xff0c;用来修饰其他函…

RabbitMQ部署

RabbitMQ部署1.单机部署1.1.下载镜像1.2.安装MQ1.3访问管理端2.集群部署2.1.集群分类2.2.设置网络1.单机部署 我们在Centos7虚拟机中使用Docker来安装&#xff0c;如未安装dockr&#xff0c;请参考《Centos7安装Docker》 1.1.下载镜像 方式一&#xff1a;在线拉取 docker …

C语言linux线程库pthread的简单使用教程

POSIX线程&#xff08;pthread&#xff09;库 POSIX线程库是用于C/C的基于标准的线程API。它允许产生一个新的并发流程。它在多处理器或多核系统上最为有效&#xff0c;在这些系统中&#xff0c;可以将流程安排在另一个处理器上运行&#xff0c;从而通过并行或分布式处理提高速…

flask框架全解

文章目录简介wsgiref安装配置文件方式一&#xff08;debug方式配置&#xff09;方式二&#xff08;环境变量方式&#xff0c;很少见&#xff09;方式三&#xff08;配置文件方式&#xff09;其他配置方式flask app路由组成写法动态路由的过滤查询字符串传参json和form等数据反向…

deepin系统如何安装惠普打印机

deepin系统如何安装惠普打印机 导读 想必现在有很多小伙伴对于deepin系统如何安装惠普打印机 安装惠普打印机的方法方面的知识都比较想要了解&#xff0c;那么今天小好小编就为大家… 想必现在有很多小伙伴对于deepin系统如何安装惠普p1007打印机 安装惠普打印机的方法方面的知…

【图卷积神经网络】02-谱域图卷积介绍

注&#xff1a;本文为第2章谱域图卷积介绍视频笔记&#xff0c;仅供个人学习使用 目录1、图卷积简介1.1 图卷积网络的迅猛发展1.2 回顾&#xff0c;经典卷积神经网络已在多个领域取得成功1.3 两大类数据1.4 经典卷积神经网络的局限&#xff1a;无法处理图数据结构1.5 将卷积扩展…

Python学习基础之快速入门

目录 首先我们下载最新的python版本&#xff1a;3.0 编写一个hello world 什么是python里面的IPO python运行有几种模式 编写一个温度转换器 在windows上执行python程序 官网&#xff1a;Welcome to Python.org Python 是一门易于学习、功能强大的编程语言。它提供了高效的…

保护视力台灯是白光还是暖光?盘点专业护眼的暖光护眼台灯

保护视力的灯光颜色是最接近太阳光最好&#xff0c;而白光与暖光主要是色温来控制的&#xff0c;低色温&#xff08;3000K以下&#xff09;&#xff0c;中性色温&#xff08;4000K左右&#xff09;&#xff0c;高色温&#xff08;5000K以上&#xff09;&#xff0c;低色温的光源…

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)

在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher) 请访问原文链接&#xff1a;https://sysin.org/blog/install-macos-13-on-unsupported-mac/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.s…

RabbitMQ入门与应用

RabbitMQ入门与应用1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比&#xff1a;2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.Basic Queue 简单队列模型3…

python机器学习数据建模与分析——pandas中常用函数总结

本文主要对数据建模与分析中常使用到的pandas内置函数进行总结分析&#xff0c;以此来熟悉数据建模与分析的流程。 文章目录一、Pandas数据结构1.1 数据结构—Series1.1.1 Series的创建方式1.1.2 使用索引和获取数据1.2 数据结构—DataFrame1.2.1 DataFrame的创建方式1.2.2 使用…

变速积分PID算法及仿真

在普通的PID 控制算法中&#xff0c;由于积分系数k是常数&#xff0c;所以在整个控制过程中&#xff0c;积分增量不变。而系统对积分项的要求是&#xff0c;系统偏差大时积分作用应减弱甚至全无&#xff0c;而在偏差小时则应加强。积分系数取大了会产生超调&#xff0c;甚至积分…