文章目录

  • 为什么要有尾部返回类型
    • 什么是返回类型推导(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尾部返回类型相关推荐

  1. void*作为函数返回类型(C语言)

    返回void*的情况 void*作为函数的返回类型的情况 导入 void*介绍 代码示例 结论 void*作为函数的返回类型的情况 导入  C语言中有一种返回值类型比较特殊,就是void*,void作 ...

  2. java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement

    无返回值函数 对于返回类型是void的函数,return后不跟表达式.最后的 return; 可以没有而让程序隐式执行.在void函数中的return语句还有提前使函数退出的作用而不进行接下来的计算, ...

  3. Java中的方法(形参及实参)return返回类型

    如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...

  4. C++基础::语法特性::函数重写(override)与协变返回类型(covariant return type)

    函数重写 在进行本文的协变返回类型(covariant return type)的讨论之前,不妨先重新温故C++关于函数重写的语法规则.协变返回类型与函数重写有着千丝万缕的联系. 首先明确函数重载(o ...

  5. C语言,函数没有return,返回类型就是void的么?

    函数没有return,返回类型不一定是void的. 也就是说,函数的返回类型还是要看函数的声明和定义. 那么定义一个具有返回值类型的函数,但是不写return,或者该函数中某些分支忘记return了, ...

  6. java 类没有返回类型,返回类型的Java方法编译时没有return语句

    问题 问题1: 为什么以下代码在没有return语句的情况下编译? public int a() { while(true); } 注意:如果我在一段时间后添加返回,那么我得到aUnreachable ...

  7. java 接口 方法的 不同_Java – 使用相同的方法和不同的返回类型实现多个接口...

    请考虑以下代码: public interface A { public A another(); } public interface B { public B another(); } publi ...

  8. 写出一下Java方法对应的签名_Java中的方法签名是否包含其返回类型?

    Java类/接口中的方法签名是否包括其返回类型? 例: Java是否知道这两种方法之间的区别: public class Foo { public int  myMethod(int param) { ...

  9. flink DataStream returns 设置返回类型

    flink map返回Tuple3时,如果不指定returns则会报错 StreamExecutionEnvironment env = StreamExecutionEnvironment.getE ...

最新文章

  1. 深度学习LiDAR定位:L3-Net
  2. Django源码分析1:创建项目和应用分析
  3. java kafka分布式_Kafka分布式消息系统
  4. [Android Pro] 完美解决隐藏Listview和RecyclerView去掉滚动条和滑动到边界阴影的方案...
  5. Linux TCP server系列(5)-select模式下的单进程server
  6. mysql connector net 6.9.3_MySQL Connector/Net 6.9.3 发布 MySQL Connector/Net 6.9.3下载
  7. cocos2dx-lua 笔记 方向控制 v2
  8. html页面转换pdf.txt
  9. basys2数码管共阳还是共阴_如何判断PLC使用接近开关是PNP还是NPN?
  10. poj 2485 Highways prim最小生成树 基础 球最小生成树中得最大边
  11. 电流检测时运放的偏置电流对精度的影响
  12. The destination is read-only
  13. 线性表学习归纳总结一
  14. 运维的工作内容是什么?有哪几种分类?
  15. [Luogu5042/UOJ #100][国家集训队互测2015]丢失的题面/ydc的题面
  16. un9.9:实现上报及上报状态修改功能。
  17. 理想低通滤波器、Butterworth滤波器和高斯滤波器
  18. lg手机显示无服务器,LG手机工程模式进入方法及菜单指令翻译(适用G6、G7、V20、V30等)...
  19. android launcher开发(4) Home键与launcher
  20. 2021年G3锅炉水处理考试及G3锅炉水处理最新解析

热门文章

  1. ios  关闭更新(第三方软件 添加描述文件)
  2. 有哪些日记app可以用来记录生活?
  3. VMware安装win7后,安装VMware Tools时报错安装程序无法继续
  4. 二进制部署kubernetes 1.25.5(二)
  5. SIMULIA现实仿真解决方案 SIMULIA仿真模拟应用程序
  6. 数字三角形 计算最大路径 动态规划
  7. Vue3+TS + element-plus 项目 动态生成Icon图标
  8. oracle税务运维脚本练习,荣欣Linux运维+Oracle DBA初级+高级全套实战训练
  9. 5.[STM32]动动小手,自己制作做一个自动浇花系统吧
  10. H5+CSS3实现官网首页--视频全屏背景