当前位置: 首页 > article >正文

掌握现代 C++:Lambda 在 C++14、C++17 和 C++20 中的演变

一、背景Lambda 是现代 C 最受欢迎的功能之一。自从在 C 11 中引入以来它们在 C 代码中无处不在。而且自从它们在 C11 中出现以来它们已经发展并获得了重要的功能。其中一些功能有助于编写更具表现力的代码并且由于现在使用 lambda 非常普遍因此花时间学习可以用它们做什么是非常值得的。本文目标是剖析 lambda 的主要演变过程但不是所有的小细节。对 lambda 的基础知识不了解可以阅读博主的另一篇文章有详细介绍。lambda 的演变一般是赋予它们手动定义函数对象的功能。二、C14 中的 Lambda在 C14 中lambda 获得了 4 项主要增强功能默认参数模板参数广义捕获从函数返回 lambda2.1、默认参数在 C14 中lambda 可以采用默认参数就像任何函数一样代码语言C自动换行AI代码解释auto myLambda [](int x, int y 0) { std::cout x - y \n; }; std::cout myLambda(1, 2) \n; std::cout myLambda(1) \n;输出代码语言Bash自动换行AI代码解释1-2 1-02.2、模板参数在 C11 中必须定义 lambda 参数的类型代码语言C自动换行AI代码解释auto myLambda [](int x){ std::cout x \n; };在 C14 中可以让它们接受任何类型代码语言C自动换行AI代码解释auto myLambda [](auto x){ std::cout x \n; };即使不需要处理多种类型这对于避免重复并使代码更紧凑和可读也很有用。例如这种 lambda代码语言C自动换行AI代码解释auto myLambda [](namespace1::namespace2::namespace3::ACertainTypeOfWidget const widget) { std::cout widget.value() \n; };变成代码语言C自动换行AI代码解释auto myLambda [](auto widget) { std::cout widget.value() \n; };2.3、广义捕获在 C11 中lambda 只能捕获其作用域中的现有对象代码语言C自动换行AI代码解释int z 42; auto myLambda [z](int x){ std::cout x - z 2 \n; };C14 借助强大的lambda广义捕获可以用几乎任何东西初始化捕获的值。示例代码语言C自动换行AI代码解释int z 42; auto myLambda [y z 2](int x) { std::cout x - y \n; }; myLambda(1);输出代码语言Bash自动换行AI代码解释1-442.4、从函数返回 lambdaLambda 受益于 C14 的语言功能从函数返回而无需指定返回类型。由于 lambda 的类型是由编译器生成的因此在 C11 中无法从函数返回 lambda。代码语言C自动换行AI代码解释/* what type should we write here ?? */ f() { return [](int x){ return x * 2; }; }在 C14 中可以通过用作返回类型来返回 lambda。这在一段代码中间有一个大的 lambda 的情况下很有用。展开代码语言C自动换行AI代码解释void f() { // ... int z 42; auto myLambda [z](int x) { // ... // ... // ... }; // ... }可以将 lambda 打包到另一个函数中从而引入另一个抽象级别展开代码语言C自动换行AI代码解释auto getMyLambda(int z) { return [z](int x) { // ... // ... // ... }; } void f() { // ... int z 42; auto myLambda getMyLambda(z); // ... }三、C17 中的 LambdaC17 为 lambda 带来了一个重大增强它们可以声明constexpr。代码语言C自动换行AI代码解释constexpr auto times2 [] (int n) { return n * 2; };然后可以在编译时评估的上下文中使用此类 lambda代码语言C自动换行AI代码解释static_assert(times2(3) 6);这在模板编程中特别有用。注意lambda 在 C20 中变得更加有用。事实上只有在 C20 中大多数 STL 算法才变得如此并且它们可以与 lambda 一起使用以创建在编译时评估的集合的复杂操作。不过有一个例外std::array非变异访问操作在 C 14 中立即变为std::array constexpr而在 C17 中变为非变异访问操作constexpr。lambda 在 C17 中获得的另一个特性是捕获*this的副本的简单语法。示例代码语言C自动换行AI代码解释struct MyType{ int m_value; auto getLambda() { return [this](){ return m_value; }; } };此 lambda 捕获this指针的副本。如果 lambda 的生存期超过对象的生存期则可能会导致内存错误例如代码语言C自动换行AI代码解释auto lambda MyType{42}.getLambda(); lambda();由于MyType在第一个语句的末尾被销毁因此第二个语句调用的lambda取消了this引用访问其m_value但this指向一个被销毁的对象。这会导致未定义的行为通常是应用程序崩溃。解决此问题是在lambda中捕获整个*this对象的副本。C17 提供了语法来实现这一点。展开代码语言C自动换行AI代码解释struct MyType { int m_value; auto getLambda() { return [*this](){ return m_value; }; } };当然在 C 14 中使用广义捕获已经可以实现相同的结果展开代码语言C自动换行AI代码解释struct MyType { int m_value; auto getLambda() { return [self *this](){ return self.m_value; }; } };只是C17 使语法更好。四、C20 中的 LambdaLambda 在 C 20 中得到进一步发展但其功能不如 C 或 C 17 那么基本。C 20 中 lambda 的一个增强功能是定义模板的经典语法使它们更接近手动定义的函数对象代码语言C自动换行AI代码解释auto myLambda []typename T(T value){ std::cout value \n; };这使得访问模板参数类型比使用 表达式如auto的 C lambda 模板更容易。另一个改进是能够捕获可变参数包代码语言C自动换行AI代码解释templatetypename... Ts void f(Ts... args) { auto myLambda [...args std::forwardTs(args)](){}; }五、总结lambda从C14到C20都有了不少的改进。但也还有更多没有总结进来。这些主要功能伴随着许多小特性让 lambda 代码更容易编写。深入研究 lambda 是更好了解 C 语言值得投入时间。

相关文章:

掌握现代 C++:Lambda 在 C++14、C++17 和 C++20 中的演变

一、背景Lambda 是现代 C 最受欢迎的功能之一。自从在 C 11 中引入以来,它们在 C 代码中无处不在。而且,自从它们在 C11 中出现以来,它们已经发展并获得了重要的功能。其中一些功能有助于编写更具表现力的代码,并且由于现在使用 l…...

如何绕过B站官方限制,用专业软件获取第三方推流码进行直播?

如何绕过B站官方限制,用专业软件获取第三方推流码进行直播? 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义…...

从零开始掌握lxml.html解析:手把手教你用html.fromstring打造高效爬虫

目录 写在前面:为什么我放弃了BeautifulSoup 一、lxml.html是什么?它凭什么这么快 二、环境搭建:5分钟搞定所有依赖 2.1 安装lxml 2.2 验证安装 2.3 配套工具推荐 三、html.fromstring()核心用法全解 3.1 最基本的用法 3.2 从文件读取HTML 3.3 从URL直接获取 3.4…...

具身智能(34):ROS2工具集合

一、构建与编译工具(开发基础) 作为 ROS2 项目的起点,负责依赖管理、代码编译与规范校验,替代 ROS1 的 catkin 工具链。 1. Colcon(核心构建工具) 定位:ROS2 官方推荐的统一构建入口,兼容多语言与大型项目。 核心特点: 支持多工作空间嵌套(Overlay/Underlay 机制)…...

如何用OpenDroneMap快速将无人机照片转为精准3D模型?新手完全指南

如何用OpenDroneMap快速将无人机照片转为精准3D模型?新手完全指南 【免费下载链接】ODM A command line toolkit to generate maps, point clouds, 3D models and DEMs from drone, balloon or kite images. 📷 项目地址: https://gitcode.com/gh_mirr…...

AppleRa1n:解锁iOS设备激活锁的实用指南

AppleRa1n:解锁iOS设备激活锁的实用指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 你是否曾经遇到过这样的情况:从二手市场购买的iPhone无法激活,或者忘记了旧…...

观测大模型API调用账单如何帮助优化项目开发成本

观测大模型API调用账单如何帮助优化项目开发成本 1. 账单明细与成本构成分析 Taotoken平台提供的账单明细功能允许开发者逐条查看API调用记录。每条记录包含调用时间、使用的模型、消耗的Token数量以及对应费用。通过分析这些数据,可以清晰了解成本构成。 在账单…...

如何高效配置浏览器扩展:专业用户的终极秘籍

如何高效配置浏览器扩展:专业用户的终极秘籍 【免费下载链接】NewTab-Redirect NewTab Redirect! is an extension for Google Chrome which allows the user to replace the page displayed when creating a new tab. 项目地址: https://gitcode.com/gh_mirrors/…...

3步搞定AI语音转换:零基础也能玩转RVC变声神器

3步搞定AI语音转换&#xff1a;零基础也能玩转RVC变声神器 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversion-Web…...

突破显存限制:ComfyUI-WanVideoWrapper实现1025帧长视频生成的实战指南

突破显存限制&#xff1a;ComfyUI-WanVideoWrapper实现1025帧长视频生成的实战指南 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否也曾面临这样的困境&#xff1a;想要创作一部完整的AI视…...

Sunshine游戏串流:5步搭建你的个人云游戏服务器终极指南

Sunshine游戏串流&#xff1a;5步搭建你的个人云游戏服务器终极指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在客厅电视上玩Steam游戏&#xff0c;却不想搬动笨重的台式…...

激光雷达多帧融合C++代码被大厂列为“核心机密”?本文首度披露跨帧特征关联与运动补偿完整实现逻辑

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;激光雷达多帧融合技术全景概览 激光雷达多帧融合是自动驾驶感知系统的核心能力之一&#xff0c;旨在将连续时间戳下的点云序列进行时空对齐、特征增强与不确定性建模&#xff0c;从而提升障碍物检测精度…...

kafka--基础--01--介绍

kafka–基础–01–介绍1、Kafka介绍 Kafka是一个分布式、分区、多副本、多生产者、多消费者的分布式消息(日志)系统Kafka基于ZooKeeper做高可用使用场景 用于 日志收集用于 消息服务1.1、设计目标 以时间复杂度为 O(1) 的方式提供消息持久化能力&#xff0c;即使对 TB 级以上…...

【PHP订单分布式处理黄金标准】:基于TCC+Saga双模式选型决策图,附2024最新性能对比基准测试报告

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHP订单分布式处理的演进与挑战 早期单体 PHP 应用常将订单创建、库存扣减、支付回调、通知发送等逻辑耦合在同一个 HTTP 请求生命周期中&#xff0c;导致高并发下单时响应延迟激增、数据库连接池耗尽、…...

.NET 9容器配置实战手册(Kubernetes+Docker+Minimal Hosting三合一)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;.NET 9容器化演进与Minimal Hosting新范式 .NET 9 将容器就绪能力深度融入运行时设计&#xff0c;原生支持无依赖、低开销的镜像构建流程。借助 dotnet publish --os linux --arch arm64 --self-contai…...

告别访问难题!镜像站聚合平台终极指南

最近在库拉上探索AI工具时&#xff0c;我顺手整理了一份镜像站聚合平台的对比清单&#xff0c;结果发现评论区炸了——太多人被访问慢、链接失效这些问题折磨过。既然大家痛点这么集中&#xff0c;今天就系统聊聊这个话题。为什么你总在和"访问不了"较劲&#xff1f;…...

LAN8720网口死活ping不通?别急着怀疑代码,先检查这4个10pF电容!

LAN8720网络接口调试指南&#xff1a;从硬件角度解决Ping不通问题 当你熬夜调试LAN8720网络接口&#xff0c;却发现无论如何都ping不通时&#xff0c;那种挫败感简直让人抓狂。作为一名嵌入式开发者&#xff0c;我完全理解这种痛苦——特别是当软件调试已经耗尽所有可能性&…...

Windows不安装 Android Studio如何打包安卓软件

我已经成功跑起来了&#xff0c;只用命令行就可以打包。用任何一个ide都可以写代码&#xff0c;尤其是ai时代。我这里克隆了一个开源的安卓项目&#xff0c;想把它在我电脑上打包成apk&#xff0c;以下是需要的环境。 安装Android SDK 使用Command line tools only 我用的是这…...

WaveTools:解锁《鸣潮》120帧体验的3大核心功能

WaveTools&#xff1a;解锁《鸣潮》120帧体验的3大核心功能 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否在为《鸣潮》游戏体验而烦恼&#xff1f;帧率被锁在60帧导致画面不够流畅&#xff1f;画质…...

ESP32双核实战:用FreeRTOS消息队列搞定传感器数据采集与Wi-Fi上传(附完整代码)

ESP32双核实战&#xff1a;用FreeRTOS消息队列搞定传感器数据采集与Wi-Fi上传&#xff08;附完整代码&#xff09; 在物联网设备开发中&#xff0c;实时性和稳定性往往是项目成败的关键。想象一下&#xff0c;当你精心设计的环境监测站因为网络上传阻塞了传感器采集&#xff0c…...

TranslucentTB:终极Windows任务栏透明美化完全指南

TranslucentTB&#xff1a;终极Windows任务栏透明美化完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Windows系统任…...

革命性岛屿设计工具:Happy Island Designer深度解析与进阶应用

革命性岛屿设计工具&#xff1a;Happy Island Designer深度解析与进阶应用 【免费下载链接】HappyIslandDesigner "Happy Island Designer (Alpha)"&#xff0c;是一个在线工具&#xff0c;它允许用户设计和定制自己的岛屿。这个工具是受游戏《动物森友会》(Animal C…...

从802.3af到802.3bt:POE标准演进全解析,你的摄像头、AP该用哪种供电方案?

从802.3af到802.3bt&#xff1a;POE供电技术选型实战指南 在智能建筑和工业物联网项目中&#xff0c;POE供电技术已经成为连接摄像头、无线AP和各类传感器的首选方案。但面对市场上从15W到100W的不同标准&#xff0c;许多工程师在设备选型时常常陷入困惑&#xff1a;为什么新部…...

League Akari:英雄联盟自动化辅助工具终极指南,轻松提升游戏体验

League Akari&#xff1a;英雄联盟自动化辅助工具终极指南&#xff0c;轻松提升游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为…...

Outlook 2016 联系人组实战:别再一个个敲邮箱了,这样群发邮件效率翻倍

Outlook 2016 联系人组实战&#xff1a;别再一个个敲邮箱了&#xff0c;这样群发邮件效率翻倍 每周一早晨&#xff0c;市场部的李经理都要给30多位客户发送项目周报。她习惯性地打开新邮件窗口&#xff0c;开始逐个输入邮箱地址——这个动作要重复30多次&#xff0c;还总担心输…...

[具身智能-572]:Trae上下文压缩的定义、必要性和意义

Trae 上下文压缩&#xff08;Context Compression&#xff09; 是其多智能体 AI 编程系统中的一项关键技术&#xff0c;旨在在保障任务理解准确性的前提下&#xff0c;动态精简、提炼和结构化项目上下文信息&#xff0c;以适配大模型有限的上下文窗口&#xff08;context windo…...

ArcGIS Pro和ArcMap数据裁剪对比:以城市绿地提取为例,我为什么推荐新工具

ArcGIS Pro vs ArcMap&#xff1a;城市绿地提取实战对比与工具迁移指南 当城市规划部门需要从全市遥感影像中批量提取公园绿地并统计面积时&#xff0c;GIS工具的选择直接影响着工作效率和成果精度。十年前我们可能毫不犹豫地选择ArcMap&#xff0c;但今天ArcGIS Pro带来的革新…...

Pandapower电力系统分析:5步快速掌握开源Python工具的核心应用

Pandapower电力系统分析&#xff1a;5步快速掌握开源Python工具的核心应用 【免费下载链接】pandapower Convenient Power System Modelling and Analysis based on PYPOWER and pandas 项目地址: https://gitcode.com/gh_mirrors/pa/pandapower 你是否正在寻找一款功能…...

Hacker News写入自动化:基于MCP协议实现AI驱动的社区交互

1. 项目概述&#xff1a;一个能“写”入Hacker News的MCP服务器 如果你和我一样&#xff0c;既是Hacker News的深度用户&#xff0c;又是Claude、Cursor这类AI工具的日常使用者&#xff0c;那你肯定遇到过这个痛点&#xff1a;想用AI帮你发个帖、回个评论&#xff0c;却发现现有…...

避坑指南:Vits语音合成模型本地部署,从环境配置到成功运行(附常见错误解决)

Vits语音合成模型实战部署&#xff1a;从环境搭建到避坑指南 第一次听到Vits生成的语音时&#xff0c;那种接近真人发音的流畅度和情感表现力让我震惊——这完全颠覆了我对开源语音合成技术的认知。但随之而来的部署过程却像一场噩梦&#xff1a;CUDA版本冲突、Gradio依赖地狱、…...