C++11返回类型后置语法的使用

c++11新特性-自动类型推导 C++11中auto并不表示一种实际的数据类型,只是一个类型声明的“占位符”。使用auto声明的变量必须进行初始化,为了让编译器推导出它的实际类型,在编译时将auto占位符替换成正真的类型。但是auto并不是万能的,并不能在任意场景下推导出变量的实际类型,使用语法为auto 变量名 = 变量值;// x是浮点型double// y是整形int// z是字符型charauto nb;// error,变量必须要初始化// 语法错误, 不能修改数据类型。 阅读详情

C++11新标准增加的auto不仅可以自动推断变量类型,还能结合decltype来表示函数的返回值。这些新特性可以让我们写出更简洁、更现代的代码。

在泛型编程中,可能需要通过参数的运算来得到返回值的类型。

我们看一下下面这个例子:

#include<iostream>
using namespace std;


template <typename R,typename T, typename U>
R add(T t,U u)
{
    return t+u;
}

int main()
{
    int a=1;
    float b=2.0;
    auto c = add<decltype(a+b)>(a,b);
}

我们并不关心a+b类型是什么,因为,只需要通过decltype(a+b)直接得到返回值类型即可。但像上面这样使用十分不方便,因为外部其实并不知道参数之间应该如何运算,只有add函数才知道返回值应当如何推导。

那么我们可不可以直接在函数定义上通过decltype拿到返回值呢?比如像这样:

template <typename T, typename U>
decltype(t+u) add(T t,U u)           //编译错误,t,u未定义
{
    return t+u;
}

运行后,编译器会提示错误,告诉我们decltype(t+u)中t和u在此作用域中尚未声明。
因为t、u在参数列表中,而C++的返回值是前置语法,在返回值定义的时候参数变量还不存在。

对于本例子,可行的写法如下:

template <typename T, typename U>
decltype(T()+U()) add(T t,U u)       
{
    return t+u;
}

考虑到T、U可能是没有无参构造函数的类,正确的写法应该是这样:

template <typename T, typename U>
decltype((*(T*)0)+(*(U*)0)) add(T t,U u)       
{
    return t+u;
}

虽然成功地使用decltype完成了返回值的推导,但写法过于晦涩,会大大增加decltype在返回值类型推导上的使用难度并降低了代码的可读性。
因此,在C++11中增加了返回类型后置语法,将decltype和auto结合起来完成返回值类型的推导。
返回类型后置语法是通过auto和decltype结合起来使用的。上面的add函数,使用新的语法可以写成:

template <typename T, typename U>
auto add(T t,U u) ->decltype(t+u)       
{
    return t+u;
}

为了进一步说明这个语法,再看另一个例子:

#include<iostream>
using namespace std;


int& foo(int& i);
float foo(float& f);

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

在这个例子中,使用decltype结合返回值后置语法很容易推导出了foo(val)可能出现的返回值类型,并将其用到了func上。

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式描述出来。

解决Matlab激活后License checkout failed问题的详细步骤与避坑指南 本文详细解析了Matlab激活后出现License checkout failed错误的常见原因及解决方案,重点介绍了如何正确找到并运行激活程序,避免用户名填写错误等常见问题。文章还提供了多次激活与疑难排解的实用建议,帮助用户顺利完成Matlab激活过程。 阅读详情

相关推荐

单细胞测序流程(十)KEGG通路富集分析与可视化圈图实战解析

本文详细解析了单细胞测序数据分析中KEGG通路富集分析与可视化圈图的完整实战流程。从差异表达基因列表出发,通过R语言进行KEGG富集分析,并利用Perl脚本进行基因ID转换,最终使用GOplot包绘制高级可视化圈图,帮助研究者将基因列表转化为有意义的生物学故事。

i7j8k9l的博客 405

C++ 新特性---->函数返回类型后置

C++新特性函数返回类型后置

m0_74036006的博客 1003

ENVI SARscape安装全攻略:从下载到汉化一步到位(附最新试用申请链接)

本文提供ENVI SARscape从下载安装到汉化的完整指南,特别针对InSAR(合成孔径雷达干涉测量)分析环境搭建。详细介绍了系统要求、分步安装流程、汉化优化方法及硬件加速配置,并分享数据处理验证和常见问题解决方案,帮助用户高效搭建遥感数据分析平台。

rnn9storyteller的博客 1407

C++返回值类型后置(跟踪返回值类型)

C++返回值类型后置(跟踪返回值类型

成长之路,不畏荆棘 599

基于ROS2的无人机野生动物巡查系统设计

自主巡检系统是嵌入式人工智能与机器人技术融合的关键应用方向,其核心在于多源感知融合、实时路径规划与端侧智能识别的协同实现。原理上依赖SLAM定位构建环境地图,结合栅格化建模与混合路径算法(如蚁群+BFS)达成全覆盖遍历;技术价值体现在资源受限平台下的确定性响应与时空对齐能力,支撑高鲁棒性野外作业。典型应用场景包括生态监测、禁飞区巡检及小尺度智能安防。本文围绕ROS2 Humble中间件架构、Livox激光雷达与MaixCAM视觉协同、YOLO11n INT8模型端侧部署等关键技术展开,突出嵌入式AI与实时控

weixin_30598047的博客 649

【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (上篇)(⭐️⭐️⭐️ 重点章节!!!)

【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配!

davidkorhenn的博客 1603

【深入理解C++】函数返回类型前置与后置

1.函数返回类型前置 2.函数返回类型后置

脚踏实地,仰望星空 735

3D 结构光相机工作原理全解 | 从编码投射到三维重建,原理 + 代码 + 工业实战一站式掌握

本文从3D结构光相机的整体架构出发,层层拆解了编码投射、相位计算、相位解包裹、三维重建的核心原理,补充了工业实战所需的公式推导、代码实现、参数调优、设备选型和案例落地,核心总结如下:相位是3D结构光成像的“灵魂”,其精度、稳定性直接决定3D重建的效果,包裹相位与绝对相位的区分的是工业实战的基础;编码投射的核心是“正弦条纹+格雷码条纹”组合,正弦条纹负责高精度相位提取,格雷码条纹辅助解包裹,适配工业场景的精度与稳定性需求;

getusushu的博客 414

模板函数——后置返回值类型(trailing return type)

后置返回值类型主要用于模板函数中,它是C++11推出的新用法。其中使用到了auto和decltype两种类型说明符。 auto和decltype虽然都是类型说明符,但是二者是不同的:auto是根据推导初始值的类型来确定变量的类型,而decltype则只是确定类型,如下所示: auto i = x + y; //通过x+y的结果类型来推导出i的类型并对其初始化 ...

HerofH_的博客 3890

Python之afdx包语法、参数和实际应用案例

Python 的 afdx 包是针对 AFDX 协议的轻量级开发工具,专注于 AFDX 数据帧的解析、构造、发送/接收、协议合规性校验等核心能力,广泛应用于航空电子设备测试、仿真、数据监控等场景。

王国平的博客 982

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

函数的后置返回类型

文章目录1 函数的后置返回类型 1 函数的后置返回类型 在C++11中引入了函数的后置返回类型,这种写法允许我们把函数返回类型放到函数名字之后,有利于返回类型很长时使得代码看起来很清晰。 对于函数的后置返回类型,前面以auto开始,表示函数返回类型放到参数列表之后,而放在参数列表之后的返回类型是通过->开始的。 示例代码如下: auto func() -> int // 函数后置返回类型 { return 100; } 参考资料: C++基础课 ...

木子皿--啥都不会的菜鸟 703

Sprd Android 13 备忘 OTA升级app没更新到目标版本,恢复出厂才生效修改这个值

【代码】Sprd Android 13 备忘 OTA升级app没更新到目标版本,恢复出厂才生效修改这个值。

m0_60898338的博客 679

现代C++新特性 函数返回类型后置

文字版PDF文档链接:现代C++新特性(文字版)-C++文档类资源-优快云下载 使用函数返回类型后置声明函数 前面已经出现了函数返回类型后置的例子,接下来我们将详细讨论C++11标准中的新语法特性: auto foo()->int { return 42; } 以上代码中的函数声明等同于int foo(),只不过采用了函数返回类型后置的方法,其中auto是一个占位符,函数名后->紧跟的int 才是真正的返回类型。当然,在这个例子中传统的函数声明方式更加简洁。而...

神奇的小强 2725

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[C++11] 返回类型后置

有了这个语法以后,对返回值类型的推导就可以用清晰的方式。

geodoer 1295

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++11后置返回类型

C++11新标准增加的auto不仅可以自动推断变量类型,还能结合decltype来表示函数的返回值。这些新特性可以让我们写出更简洁、更现代的代码。 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。 我们看一下下面这个例子: #include<iostream> using namespace std; template <typename R,typename T, typename U> R add(T t,U u) { return t+u; } int

QtHalcon 624

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++11新特性之返回类型后置

返回类型后置(Trailing return type)是 C++11 引入的一种新的函数声明和定义语法,它允许将函数的返回类型放在函数参数列表之后,使用。(2)对于一些复杂的返回类型,如嵌套的模板类型或需要通过类型特征(type traits)来推导的类型,返回类型后置可以使代码更易读。在这个例子中,返回类型是一个嵌套的模板类型,使用返回类型后置可以将复杂的类型推导部分放在函数参数列表之后,使函数声明的主体部分更清晰。会根据a和b的实际类型推导出a*b 表达式的类型,作为函数的返回类型。

qq_55527904的博客 909

C++11 FAQ中文版:返回值类型后置语法

二28 Year 2011陈 良乔C++11 FAQ 返回类型后置语法 考虑下面这段代码: template ??? mul(T x, U y) { return x*y; } 函数mul()的返回类型要怎么写呢?当然,是“x*y类型”,但是这并不是一个数据类型,我们如何才能一开始就得到它的真实数据类型呢?在初步了解C++0x之后,你可能一开始想到使用decltype来推断

_rabbit的专栏 802

【C++11】函数返回类型后置

C++ 的函数返回类型后置(trailing return type)允许将返回类型写在参数列表之后,使用 `->` 语法,主要用于简化复杂返回类型的表达,特别是在模板编程中提高可读性和类型推导的灵活性。

qq_52208569的博客 598

C++11 decltype

有下面这个情况: template <class T1, class T2> void ft (T1 &x, T2 &y) { ... ?type? xpy = x+; ... } 在这种情况下xpy应该是什么类型呢?由于不知道ft()将如何使用,因此无法预知这一点。正确的类型可能是T1、T2或者其他类型。假如又出现了重载运算符,这会让问题更加的复杂。 于是为...

xupeng1644的博客 1449

【C++11学习笔记】返回类型后置语法

本次学习3个知识点: (1)auto推导类型 (2)decltype推导表达式的类型 (3)返回类型后置语法泛型编程中经常遇到的写一个加法函数:template <typename R, typename T, typename U> R add(T t, U u) { return (t + u); }int a = 10; float b = 20.0; auto c = add<

华秋实的专栏 8847

c++ 11 auto 与 decltype 结合,返回类型后置 (转)

转自 这里 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景: template <typename R, typename T, typename U> R add(T t, U u) { return t+u; } int a = 1; float b = 2.0; auto c = add<decltype(a + b)>(a, b); 我们并不关心 a+b 的类型是什么,因此,只需要通过 decltype(a+b) 直接得到返回值类型即可。但

一个老菜鸟的学习分享 507

decltype和返回类型后置

decltype和返回类型后置

jianmo的博客 273

C++11 | 返回类型后置

返回类型后置 是什么 先看个熟悉的,这个就是返回类型前置 int Fun() { return 0; } 那么,我们把 int 放到后面是不是就是返回类型后置了呢 是的,就是这样,形如这样 auto Fun()->int { return 0; } auto 是一个占位符,没什么实际意义 返回类型后置用来干嘛? 从直观上来说,看下面两种代码方式 // 方式1 typedef int(*arr)[2]; arr Fun1() { return...

大袖Daxiu的博客 591

C++11:返回值类型后置(跟踪返回值类型)

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式(直接通过参数做运算)描述出来,而不需要像 C++98/03 那样使用晦涩难懂的写法。

crossoverpptx的博客 384

C++的decltype和返回类型后置

C++的decltype和返回类型后置

little_startoo的博客 322
上一篇: Python3使用SMTP协议发送电子邮件
下一篇: Java类的初始化块总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值