C++关于 lambda 表达式包含多条返回语句的问题

浅析C#中的Lambda表达式 上文中用了一点篇幅讲述了匿名方法的使用。自从C#3.0开始,就可以使用一种新语法把视线代码赋予委托,即Lambda表达式。只要有委托参数类型的地方,就可以使用Lambda表达式。上文中使用匿名方法的例子可以改为使用Lambda表达式。语法: Lambda表达式的定义方式为:“([参数列表]) => 表达式”。运算符“=>”是一种与赋值运算“=”具有相同优先级的右结合运算符,在英语里读作:“goes 阅读详情

起因

在《C++ Primer 5th》中10.3.3节中提到一下例子:

//错误:不能推断lambda的返回类型
transform (vi.begin(), vi.end(), vi.begin(),
	[](int i){ if (i< 0) return -i; else return i; });

并表示:

但是,如果我们将程序改写为看起来是等价的 if 语句,就会产生编译错误。编译器推断这个版本的 lambda 返回类型为 void ,但它实际上返回了一个 int 值。

解决过程

在 stackoverflow 上查询相关问题,得到的回答是自从 C++14 后, lambda 表达式支持多条返回语句。

… the return type of the closure’s operator() is determined according to the following rules:

  • if the body consists of nothing but a single return statement with an expression, the return type is the type of the returned expression (after lvalue-to-rvalue, array-to-pointer, or function-to-pointer implicit conversion); otherwise, the return type is void. (until C++14)
  • The return type is deduced from return statements as if for a function whose return type is declared auto. (since C++14)

但是实际上在C++11标准的 gcc 和 clang 编译器上,上面例子的这条语句都通过了编译。

在这里插入图片描述
最后,我在 stackoverflow 上找到了答案:

There’s no technical reason for this. IIRC it was already implemented by the GCC C++ maintainer and he said it’s trivial to implement.
The committee is very conservative about accepting features into the Standard so they went with this simple form of deduction and will later hopefully accept a more powerful form. See the reason for rejection on US 30 comment.
DR 975 is already marked “ready” so chances are good it will be accepted.

而且,题主还在后面补充了一个新内容 an official proposal for this extended return type deduction for all function types, and not only lambdas 。

C++ [ lambda 表达式 ] 捕捉列表,该列表总是出现在 lambda 函数的开始位置,编译器根据[]来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下⽂中的变量供 lambda函数使⽤,捕捉列表可以传值和传引⽤捕捉,捕捉列表为空也不能省略。函数体内的实现跟普通函数完全类似,在该函数体内,除了可以使⽤其参数外,还可以使⽤所有捕获到的变量,函数体为空也不能省略。在需要回调函数的场景中,Lambda表达式可以简化代码。对于全局域定义的lambda表达式,捕捉列表必须为空,因为全局变量不⽤捕捉就可以⽤,没有可被捕捉的变量。 阅读详情

相关推荐

深入理解C++ Lambda表达式:从基础到高级应用

在现代C++编程中,Lambda表达式已经成为不可或缺的特性之一。自C++11引入以来,Lambda极大地改变了我们编写函数对象和回调的方式,使代码更加简洁、表达力更强。本文将全面探讨C++ Lambda表达式的各个方面,从基础语法到高级应用场景,帮助读者掌握这一强大的编程工具。

vvilkin的学习备忘 1378

Lambda表达式

Lambda表达式 出现背景 java是一流的面向对象语言,除了部分简单的数据类型,java中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象,在java中定义的函数或方法不可能完全独立,也不能将方法作为参数或返回一个方法给实例 在java8以前,若我们想要把某些功能传递给某个方法,总要去写匿名类 例如: String []arr={“b”,“a”,“c”,“d”};从大到小排列 public class Demo { public static void main(Strin

qq_51707222的博客 601

保姆级教程:用torch.profiler给你的vLLM推理做个“全身体检”(附Perfetto可视化分析)

本文提供了一份详细的vLLM推理性能分析教程,通过torch.profiler和Perfetto工具链实现从数据采集到可视化分析的全流程。文章涵盖了环境配置、性能数据采集、trace文件解析以及Perfetto可视化分析,帮助开发者优化大模型推理服务的性能,显著降低计算资源消耗。

weixin_29041767的博客 356

c++ 14 新特性

1.函数返回值推导 auto func_one(int i) { return i; } // 模板中也可以这样玩 template<typename T> auto func_one(T t){ return t; } cout << func_one(2) << " " << func_one<double>(5.5) << endl; // ...

baidu_16370559的博客 569

Notion卡顿救星:3分钟搞定DNS优化,手机电脑全平台加速指南

本文针对Notion访问慢和卡顿问题,提供了全平台DNS优化与Hosts文件修改的详细指南。通过更换优质DNS服务器或建立静态IP映射,可有效解决因网络延迟和域名解析导致的加载缓慢,实现手机与电脑端的快速加速,提升Notion使用流畅度。

v6b7n8m9q0的博客 1306

空间节省算法在Rowhammer防御中的应用与优化

空间节省算法(Space-Saving)是一种高效的流式数据处理算法,主要用于在有限内存条件下实时识别数据流中的高频项。其核心原理是通过维护固定大小的计数器表,动态跟踪最活跃的元素,适用于处理无限数据流场景。该算法在内存安全领域具有重要价值,特别是在Rowhammer攻击防御中,能够有效检测异常高频访问的DRAM行地址。通过结合计数器衰减策略(如DSAC)和混合架构设计,空间节省算法可以在保证低硬件开销的同时,提供高精度的攻击检测能力。这些技术已成功应用于现代DDR5内存控制器,展现出优异的工程实践价值。

weixin_31139479的博客 606

C++中的Lambda函数

介绍与引入 最近在阅读C++ Concurrency in Action 2rd edition 以学习C++的多线程特性,发现许多地方都使用了Lambda函数,因此就附录里的内容做一些笔记。 Lambda函数是C++11标准中新增的一个特性,允许在需要使用的时候才进行定义,这种语法糖的特性大大简化了代码复杂度,在某些时候特别有用。其语义可以用来快速地表示可访问的变量,而非使用类中函数来对成员变量进行捕获。 基本的Lambda表达式 Lambda表达式最简单的形式,便是一个self-containe

Tsunaou的试验场 2305

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 88

深入浅出 C++ Lambda表达式:语法、特点和应用

Lambda表达式是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象(闭包)的简便方法。是捕获列表,用于指定 Lambda表达式可以访问的外部变量,以及是按值还是按引用的方式访问。捕获列表可以为空,表示不访问任何外部变量,也可以使用默认捕获模式或来表示按引用或按值捕获所有外部变量,还可以混合使用具体的变量名和默认捕获模式来指定不同的捕获方式。是参数列表,用于表示 Lambda表达式的参数,可以为空,表示没有参数,也可以和普通函数一样指定参数的类型和名称,还可以在 c++14 中使用auto。

宁子希的博客 9万+

halcon C++编程 第4讲 HObject/HImage Mat相互转换(tcy)

网上有很多相互转换程序,但并不知那个正确,本文对相互转换后的结果和原对象比较是否相同判断转换是否正确。经测试ok.本文包括转换代码及测试是否相同。 1.转换程序: /************************************ HObject转为Mat:time:2021/3/16 V1.0 *************************************/ cv::Mat HalconClass::HObjectToMat(const HalconCpp::HObject&..

tcy-阿春 4928

Open3D (C++) 计算点云坐标最值及其索引

使用C++版本的Open3D计算点云最值点及其对应的下标索引

点云侠的博客 726

c++中的Lambda表达式详解

摘要: C++11引入的Lambda表达式是一种匿名函数对象,极大简化了代码编写。其语法为捕获列表->返回类型{函数体},其中捕获列表决定对外部变量的访问方式(值捕获、引用捕获等)。Lambda广泛应用于STL算法(如sort、for_each)、异步编程(std::thread)、回调函数等场景,提升代码局部性和可读性。返回值可通过显式声明或编译器自动推导处理。Lambda支持赋值给变量(推荐auto或std::function),便于复用和传递,同时避免命名污染。结合捕获能力与函数式特性,Lamb

cyz322649的博客 1883

国产FPGA高云GW1NSR-4C,集成ARM Cortex-M3硬核

从板子整体角度来看,这是一款国产化程度很高的板子,从主控FPGA,到JTAG芯片,存储芯片、电源芯片等,都是使用的国产半导体公司的产品。板子整体尺寸也比较迷你,属于小而美类型的,可以认为是一款FPGA核心板,当然也预留了排针接口,给用户足够的扩展空间。对于想了解高云小蜜蜂SoC软硬件开发,以及对云源软件、MCU开发环境做个深度评测来说足够了。JTAG调试器固件可以增加虚拟串口功能,对于板子本来来说面积不会有改动,只需要添加两根信号线即可。

whik1194的博客 6392

C++中的lambda表达式用法及示例

Lambda表达式(也叫lambda函数,或简称lambda),是从C++ 11开始引入并不断完善的,是能够捕获作用域中变量的匿名函数对象。因为C++是不能嵌套定义函数的,所以lambda就成了我们构造闭包的主要手段(和临时短函数)。本文主要展示lambda的基本使用。 lambda的基本语法如下:  [capture](parameters)->return-type{body} 1. 如果没有参数,空的圆括号()可以省略。 2. 返回值也可以省略(无论返回类型是否为void),但是原则上

jinking01的专栏 5641

Coze智能体开发:工作流教程之解析文件概述

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 1792

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ Lambda表达式:语法、特点和原理

在本文中,我们将介绍 c++ Lambda表达式的定义、用法、特点和原理通过多个例子,展示了 Lambda表达式的参数、返回值、捕获、引用、修改等方式,以及如何用它们定义匿名函数和算法。Lambda表达式是一种在被调用的位置或作为参数传递给函数的位置定义匿名函数对象(闭包)的简便方法。capture list 是捕获列表,用于指定 Lambda表达式可以访问的外部变量,以及是按值还是按引用的方式访问。捕获列表为空,表示不访问任何外部变量,

weixin_73579626的博客 1345

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++新特性之Lambda表达式

本文系统介绍了C++中Lambda表达式的语法、特点与应用。首先阐述了Lambda的基本语法结构,包括捕获列表、参数列表、返回类型和函数体的定义方式。重点分析了四种捕获方式:值捕获、引用捕获、隐式捕获和初始化捕获的特点与区别。随后探讨了Lambda表达式的实现原理,说明其本质是重载operator()的匿名类对象。文章详细介绍了各C++标准对Lambda的扩展,包括C++14的泛型Lambda、C++17的*this捕获、C++20的模板参数等新特性。最后列举了Lambda在排序算法、函数绑定、线程编程等场

andre617的专栏 1374

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lambda表达式详解

C++11标准引入了lambda表达式,这是一种匿名函数对象,极大地提升了代码的便捷性和灵活性。lambda表达式在编译时被转换为匿名类函数,通过重载()运算符实现。其基本语法为[capture list](parameter list) -> return type { function body },其中捕获列表允许lambda访问上下文中的变量。lambda表达式在泛型编程中尤为重要,能够简化如sort和for_each等算法的自定义操作。通过捕获列表,lambda可以轻松实现软编码,处理复杂逻辑。

2301_81405396的博客 1583

【C++】C++中Lambda表达式的用法笔记

在C++中,lambda表达式提供了一种定义匿名函数对象的方式。这些函数对象可以捕获它们所在作用域中的变量,并且可以作为参数传递给其他函数,或者赋值给函数指针和函数对象。lambda表达式的语法灵活,可以非常方便地定义和使用。

qq_52924376的博客 750

C++笔记 Lambda表达式

捕获列表](参数列表) mutable noexcept -> 返回值类型 {函数体;;捕获列表是核心,分5种:[]、[var]、[&var]、[=]、[&],不可混合冲突;值捕获默认只读,需修改内部拷贝加mutable;引用捕获需注意变量生命周期;返回值可自动推导(单条return),多条return需显式指定;最常用场景:STL算法参数、多线程回调、简单逻辑的临时函数;本质是函数对象,可赋值给std::function,支持递归(需借助function)。

堇荼如饴风禾尽起~ 806

C++11的Lambda表达式

随着函数式编程语言的应用,很多语言都提供了 lambda 表达式,如 C#,Python,Java 8。lambda 表达式可以方便地构造匿名函数,如果代码里面存在大量的小函数,而这些函数一般只被调用一次,那么将他们重构成 lambda 表达式。C++11新标准里添加了lambda表达式这个语言特性,有着自己特定的格式和要求。C++11 lambda格式lambda表达式的通用格式如下:[captu

Oshyn —— 乐而学,学而乐 510

C++ 0x新特性:详细讲解lambda表达式

此文为本人的原创翻译,转载请注明作者及版权信息!!翻译:李波Email: libo22@gmail.comLambda表达式和闭包,part1C++标准委员会在2008年2月的Bellevue会议上通过了lambda的提议,最新版本的提议与我2005年在这里展

未语愁眸 9590

Visual Studio 2012 C++ lambda表达式

C++lambda表达式 lambda表达式 C++ 语言中的lambda表达式在很多情况下提供了函数对象的另一种实现机制。Lambda表达式并不是STL所特有的,但它广泛应用于这一环境中。Lambda是表达式是定义一个没有名称、也不需要显示类定义的函数对象。Lambda表达式一般作为一种手段,用来将函数作为实参传递到另一个函数。相比于定义和创建一个常规的函数对象而言,lambda表达式非

shun01的专栏 1026
上一篇: 《C++Primer 第五版》——第九章 顺序容器
下一篇: 《C++Primer 第五版》——第十章 泛型算法
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值