Trailing return types尾部返回类型
文章目录
- 为什么要有尾部返回类型
- 什么是返回类型推导(return type deduction)
- 不是什么时候都要使用尾部返回类型
尾部返回类型在C++中是一个很奇怪的内容,我们应该只在必要的时候使用。我们要决定采用它作为一种通用风格的时候一定要小心,并尽量的保持这种风格。
首先看下列代码:
auto getMulticastHops() const -> int;
这是一种声明C++11语言中函数的方法。->int
部分称为尾部返回类型,这行代码和一下代码是相同的:
int getMulticastHops() const;
为什么要有尾部返回类型
有很好的理由在C++11中引入尾部返回类型。标准示例是函数模板,当其中返回类型取决于参数类型的时候。我们举个例子来看,一个函数有两个值相乘:
template<class T,class U>
auto multiply(T const& lhs,U const& rhs)->decltype(lhs* rhs)
{return lhs * rhs;
}
我们可以使用std::declval
来避免使用尾部返回类型,只是这样的话代码就会肉眼可见的混乱不堪,很难快速阅读:
template<class T, class U>
decltype(std::declval<T>() * std::declval<U>())
multiply(T const& lhs, U const& rhs)
{return lhs * rhs;
}
除此之外还有个例子是lambda表达式,其中语法不允许声明返回类型常规的方式。
什么是返回类型推导(return type deduction)
C++11的lamdba表达式已经对比较简单的情况进行了返回类型推导。C++14为更为一般的情况和普通函数添加了返回类型推导。上面的函数可以简单的写成:
template<class T, class U>
auto multiply(T const& lhs, U const& rhs)
{return lhs * rhs;
}
返回类型推导可以帮助我们处理许多以前需要尾部返回类型的情况,当然不是所有的情况。例如,编译器总是根据值来推导返回值,而不是根据引用。因此如果我们想从一个lambda表达通过引用返回,就没有办法使用尾部返回类型。其他不能返回类型推导的情况还有没有主体函数的声明,当然这不会是lambda表达式。
不是什么时候都要使用尾部返回类型
现在在任何地方都使用尾部返回类型可能很有吸引力。有些人还认为它们使我们的代码更一致。有些人使用它们是因为它们必须在某些地方使用,但许多人也会使用它们,因为它们是新的,新的很酷。我们有很多这样的新特性和可能性。它们被大肆宣传,有时被过度使用。但是要记住我们使用一定要有正确的理由。现在也有一些反对这种风格的理由:
Trailing return types尾部返回类型相关推荐
- void*作为函数返回类型(C语言)
返回void*的情况 void*作为函数的返回类型的情况 导入 void*介绍 代码示例 结论 void*作为函数的返回类型的情况 导入 C语言中有一种返回值类型比较特殊,就是void*,void作 ...
- java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement
无返回值函数 对于返回类型是void的函数,return后不跟表达式.最后的 return; 可以没有而让程序隐式执行.在void函数中的return语句还有提前使函数退出的作用而不进行接下来的计算, ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
- C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)
函数重写 在进行本文的协变返回类型(covariant return type)的讨论之前,不妨先重新温故C++关于函数重写的语法规则.协变返回类型与函数重写有着千丝万缕的联系. 首先明确函数重载(o ...
- C语言,函数没有return,返回类型就是void的么?
函数没有return,返回类型不一定是void的. 也就是说,函数的返回类型还是要看函数的声明和定义. 那么定义一个具有返回值类型的函数,但是不写return,或者该函数中某些分支忘记return了, ...
- java 类没有返回类型,返回类型的Java方法编译时没有return语句
问题 问题1: 为什么以下代码在没有return语句的情况下编译? public int a() { while(true); } 注意:如果我在一段时间后添加返回,那么我得到aUnreachable ...
- java 接口 方法的 不同_Java – 使用相同的方法和不同的返回类型实现多个接口...
请考虑以下代码: public interface A { public A another(); } public interface B { public B another(); } publi ...
- 写出一下Java方法对应的签名_Java中的方法签名是否包含其返回类型?
Java类/接口中的方法签名是否包括其返回类型? 例: Java是否知道这两种方法之间的区别: public class Foo { public int myMethod(int param) { ...
- flink DataStream returns 设置返回类型
flink map返回Tuple3时,如果不指定returns则会报错 StreamExecutionEnvironment env = StreamExecutionEnvironment.getE ...
最新文章
- 深度学习LiDAR定位:L3-Net
- Django源码分析1:创建项目和应用分析
- java kafka分布式_Kafka分布式消息系统
- [Android Pro] 完美解决隐藏Listview和RecyclerView去掉滚动条和滑动到边界阴影的方案...
- Linux TCP server系列(5)-select模式下的单进程server
- mysql connector net 6.9.3_MySQL Connector/Net 6.9.3 发布 MySQL Connector/Net 6.9.3下载
- cocos2dx-lua 笔记 方向控制 v2
- html页面转换pdf.txt
- basys2数码管共阳还是共阴_如何判断PLC使用接近开关是PNP还是NPN?
- poj 2485 Highways prim最小生成树 基础 球最小生成树中得最大边
- 电流检测时运放的偏置电流对精度的影响
- The destination is read-only
- 线性表学习归纳总结一
- 运维的工作内容是什么?有哪几种分类?
- [Luogu5042/UOJ #100][国家集训队互测2015]丢失的题面/ydc的题面
- un9.9:实现上报及上报状态修改功能。
- 理想低通滤波器、Butterworth滤波器和高斯滤波器
- lg手机显示无服务器,LG手机工程模式进入方法及菜单指令翻译(适用G6、G7、V20、V30等)...
- android launcher开发(4) Home键与launcher
- 2021年G3锅炉水处理考试及G3锅炉水处理最新解析
热门文章
- ios 关闭更新(第三方软件 添加描述文件)
- 有哪些日记app可以用来记录生活?
- VMware安装win7后,安装VMware Tools时报错安装程序无法继续
- 二进制部署kubernetes 1.25.5(二)
- SIMULIA现实仿真解决方案 SIMULIA仿真模拟应用程序
- 数字三角形 计算最大路径 动态规划
- Vue3+TS + element-plus 项目 动态生成Icon图标
- oracle税务运维脚本练习,荣欣Linux运维+Oracle DBA初级+高级全套实战训练
- 5.[STM32]动动小手,自己制作做一个自动浇花系统吧
- H5+CSS3实现官网首页--视频全屏背景