C++ lambda表达式

写法格式

lambda表达式的写法格式如下:

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

各部分的说明为:
[capture-list] : 捕获列表,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。必须要有,即使为空也要写一个[]。
(parameters):参数列表,就是函数的参数列表。如果不需要传参,是可以将()省略的。
mutable:默认情况下,lambda函数是一个const函数,并不支持对捕获到的变量进行修改。mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。mutable是根据需要选择加不加的。
ret:返回值类型,用于追踪函数的返回值类型。没有返回值时此部分可省略。如果返回值的

可由编译器推导,也可省略。
{statement}:函数体。可以使用所有捕获到的变量。

因此C++11中最简单的lambda函数为:[]{}; 表示该lambda函数不能做任何事情。

其中,返回值类型后置的写法(->ret)是有迹可循的,返回值类型后置又称跟踪返回类型,允许函数的返回类型在函数声明时不显式指定,而是推断出来。例如(参考:C++返回值类型后置)

int& foo(int& i);
float foo(float& f);template <typename T>
auto func(T& val) -> decltype(foo(val))
{return foo(val);
}

捕获列表说明

  • [] 不捕获任何变量。
  • [&] 捕获父作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
  • [=] 捕获父作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
  • [=,&foo1, &foo2, ……] 按值捕获外部作用域中所有变量,其中变量foo1、foo2等按引用捕获。
  • [val] 按值捕获变量val,且不捕获其他变量。
  • [&val] 按引用捕获变量val,且不捕获其他变量。
  • [this] 捕获当前类中的 this 指针,让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 & 或者 =,就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量。

注意事项:

  1. 父作用域指包含lambda函数的语句块,即lambda表达式所在的作用域。
  2. 语法上捕捉列表可由多个捕捉项组成,以逗号分割。
  3. 捕捉列表不允许变量重复传递,否则就会导致编译错误。
  4. 在块作用域以外的lambda函数捕捉列表必须为空。其中块作用域是指lambda表达式
  5. 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都会导致编译报错。
  6. lambda表达式之间不能相互赋值,即使看起来类型相同。
  7. 由于&表示的是引用捕获,所以就不能用取地址的方式捕获一个地址了。

用法理解

lambda表达式的类型在 C++11 中被称为“闭包类型”,可以理解为“闭包让你可以在一个内层函数中访问到其外层函数的作用域”。从上层用户的角度来看,lambda表达式就相当于是一个匿名函数对象,严格来说是匿名的非枚举类的对象。也就是说,lambda是一个匿名函数对象,故而其类型为匿名类,所以一般情况下很难拿到lambda表达式的类型,一般是通过function包装器等间接地使用lambda表达式。

lambda表达式在底层实现上和模板有些相似,lambda表达式其实是由编译器为我们生成一个类,类内重载了operator()。也就是说C++的lambda表达式本质上就是在编译器在底层帮我们生成了一个仿函数,其中仿函数的类名是lambda+uuid。也就是说,lambda表达式在使用上是一个匿名函数对象,但其实在底层实现上它是一个有名的仿函数,这里需要注意区分。

而捕获列表本质上就是lambda表达式创建的类中成员函数,而捕获的变量默认不支持修改其实是因为底层的仿函数是一个const函数(放在函数名后面的那种)。

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

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

相关文章

【ArcGIS Pro微课1000例】0055:Pro中如何处理个人数据库(.mdb)

文章目录 原因分析解决方案使用ArcGIS Pro的用户应该已经发现个人地理数据库(.mdb)不能使用了。随着ESRI的软件技术革新,在ArcGIS Pro中不再支持且将来也不会支持个人地理数据库(.mdb)。这个确实很烦人,很多项目还是在使用mdb数据库的。不过ESRI也给出了一些解决办法,不…

二叉搜索树的简单C++类实现

二叉搜索树&#xff08;BST&#xff09;是一种重要的数据结构&#xff0c;它对于理解树的操作和算法至关重要。本文将通过一个C示例来展示如何实现一个BST&#xff0c;并在插入和删除节点时提供清晰的输出&#xff0c;以帮助可视化这些操作的过程。 二叉搜索树的节点结构 首先…

Elasticsearch 8.9 search命令执行查询源码

一、相关的API的handler1、接收HTTP请求的handler2、往数据节点发送查询请求的action(TransportSearchAction)3、通过transportService把查询请求发送到指定的数据节点 二、数据节点收到请求的处理逻辑1、尝试从缓存中加载查询结果2、不通过缓存查询&#xff0c;直接执行查询(1…

Elasitcsearch--解决CPU使用率升高

原文网址&#xff1a;Elasitcsearch--解决CPU使用率升高_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决ES导致的CPU使用率升高的问题。 问题描述 线上环境 Elasticsearch CPU 使用率飙升常见问题如下&#xff1a; Elasticsearch 使用线程池来管理并发操作的 CPU 资源。…

智慧农业大数据可视化UI,数据展示平台(免费可视化大屏模版PS资料)

大屏幕展示方式可以实现信息的直观呈现与交互操作&#xff0c;使农业生产者能够一目了然地掌握有关农情、天气、土壤等数据信息&#xff0c;从而科学决策。智慧农业大数据可视化大屏是提升农业生产效益的一种重要工具。 现分享亩产效益指标、农业大数据可视化、农业数据展示平…

QEMU源码全解析 —— virtio(11)

接前一篇文章&#xff1a; 上一回对于virtio_balloon_pci_realize函数进行了详细解析。最后讲到在virtio_balloon_pci_realize函数的最后一步调用了object_property_set函数&#xff0c;从而导致了virtio_device_realize函数的执行。本回就来对于virtio_device_realize函数进行…

Flutter工具安装与环境搭建

1、下载 Flutter SDK&#xff0c;下载完成后&#xff0c;在需要放置SDK的地方解压即可。 注意&#xff1a; 请勿将 Flutter 有特殊字符或空格的路径下。请勿将 Flutter 安装在需要高权限的文件夹内&#xff0c;例如 C:\Program Files\。 2、配置环境变量 例如&#xff1a; …

NO-IOT翻频,什么是翻频,电信为什么翻频

1.1 翻频迁移最终的目的就是减少网络的相互干扰&#xff0c;提供使用质量. 1.2 随着与日俱增的网络规模的扩大&#xff0c;网内干扰已成了影响网络的质量标准之一&#xff0c;为了保障电信上网体验&#xff0c;满足用户日益增长的网速需求,更好的服务客户&#xff0c;电信针对…

【迅搜09】索引管理(二)增删改操作

索引管理&#xff08;二&#xff09;增删改操作 今天我们来学习真正的&#xff0c;最核心的索引管理相关的操作。但其实今天的内容还更简单一些&#xff0c;为啥呢&#xff1f;因为索引管理中&#xff0c;最核心的就是对于数据的增、删、改呀。其实要往大了说&#xff0c;查询也…

缓存的定义及重要知识点

文章目录 缓存的意义缓存的定义缓存原理缓存的基本思想缓存的优势缓存的代价 缓存的重要知识点 缓存的意义 在互联网高访问量的前提下&#xff0c;缓存的使用&#xff0c;是提升系统性能、改善用户体验的唯一解决之道。 缓存的定义 缓存最初的含义&#xff0c;是指用于加速 …

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问&#xff1f;docker容器Post…

CleanMyMac X2024(Mac优化清理工具)v4.14.5中文版

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

《每天一个Linux命令》 -- (15) mkdir命令

欢迎阅读《每天一个Linux命令》系列 &#xff01;在本篇文章中&#xff0c;将说明mkdir命令用法。 概念 mkdir命令是Linux系统下的目录创建命令&#xff0c;用于创建指定的目录。 英文原意&#xff1a;make directories&#xff0c;所在路径&#xff1a;/bin/mkdir&#xff0…

【AI】YOLO学习笔记

作为经典的图像识别网络模型&#xff0c;学习YOLO的过程也是了解图像识别的发展过程&#xff0c;对于初学者来说&#xff0c;也可以了解所采用算法的来龙去脉&#xff0c;构建解决问题的思路。 1.YOLO V1 论文地址&#xff1a;https://arxiv.org/abs/1506.02640 YOLO&#x…

软件设计师——计算机网络(三)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

混淆相加和拼接(js的问题)

JavaScript 中的加号 "()" 有两个功能&#xff1a;相加和拼接。也就是数字的相加和字符串的拼接。一些开发者经常会误用这个操作符。 比如&#xff1a; const num1 30; ​​const num2 "20"; ​​const num3 30; ​​const word1 "Java" ​…

成本管理常用的ChatGPT通用提示词模板

成本分析&#xff1a;如何进行成本分析&#xff1f; 成本核算&#xff1a;如何进行成本核算&#xff1f; 成本控制&#xff1a;如何控制成本&#xff1f; 成本效益分析&#xff1a;如何进行成本效益分析&#xff1f; 成本预测&#xff1a;如何预测成本&#xff1f; 成本决…

Automotive Bionics

汽车仿生学是一种通过模拟生物系统的某些特征来设计汽车的方法。一些典型的汽车仿生学例子包括&#xff1a; 鲨鱼式车型&#xff1a;这种车型的设计灵感来源于鲨鱼的流线型身体&#xff0c;这种设计能够减少空气阻力和水阻力&#xff0c;提高车辆的燃油效率和行驶速度。 甲壳虫…

汽车EDI:Chrysler EDI项目案例

菲亚特克莱斯勒汽车Fiat Chrysler Automobiles(FCA)是一家全球性汽车制造商&#xff0c;主营产品包括轿车、SUV、皮卡车、商用车和豪华车等多种车型。其旗下品牌包括菲亚特、克莱斯勒、道奇、Jeep、Ram、阿尔法罗密欧和玛莎拉蒂等。 Chrysler通过EDI来优化订单处理、交付通知、…

Fuzz进阶教学——基于机器学习的模糊测试相关工作

【参考文献】[1]王鹃,张冲,龚家新等.基于机器学习的模糊测试研究综述[J].信息网络安全,2023,23(08):1-16. 目录 一、机器学习在测试用例生成中的应用 1、文件解析软件的测试用例生成 2、网络协议的测试用例生成 3、代码解析工具的测试用例生成 二、机器学习在测试用例变异中…