C++11如何引入的尾置返回类型

目录
  • 一、什么是尾置返回类型(trailing return type)
  • 二、尾置返回的典型场景
    • 2.1 常规方式如何返回数组指针
    • 2.2 使用尾置返回类型
  • 三、尾置返回类型的应用
  • 四、总结

一、什么是尾置返回类型(trailing return type)

我们先来看一下传统的函数是怎么定义的:

int foo()
{
    return 0;
}

C++11 标准中引入了尾置返回类型后,上述函数也可定义为:

auto foo() -> int
{
    return 0;
}

其中 auto 是一个占位符,函数名后 -> 紧跟的 int 才是真正的返回类型。

当然了,在这个例子中传统的函数声明方式显然是更加简洁的,而当返回类型比较复杂的时候,返回类型后置可能会是一个不错的选择。任何函数的定义都能使用尾置返回。

二、尾置返回的典型场景

2.1 常规方式如何返回数组指针

首先来看一下如何返回数组指针。

因为数组不能被拷贝,所以函数不能返回数组。不过,函数可以返回数组的指针或应用。虽然从语法上来说,想要定义一个返回数组的指针或引用的函数比较繁琐,但是有一些方法可以简化这一任务,其中最直接的方法是使用类型别名。

typedef int arrT[10];   // arrT 是一个类型别名,它表示的类型是含有10个整数的数组
using arrT = int[10];   // arrT 的等价声明
arrT* func(int i);      // func 返回一个指向含有10个整数的数组的指针

其中 arrT 是含有10个整数的数组的别名。因为我们无法返回数组,所以将返回类型定义成数组的指针。因此,func 函数接收一个int实参,返回一个指向包含10个整数的数组的指针。

要想在声明 func 时不使用类型别名,我们必须牢记被定义的名字后面数组的维度:

int arr[10];        // arr 是一个含有10个整数的数组
int *p1[10];        // p1 是一个含有10个指针的数组
int (*p2)[10];      // p2 是一个指针,它指向含有10个整数的数组

和这些声明一样,如果想定义一个返回数组指针的函数,则数组的维度必须跟在函数名字之后。然而,函数的形参列表也跟在函数名字后面且形参列表应该先于数组的维度。因此,返回数组指针的函数形式如下所示:

int arr[10];        // arr 是一个含有10个整数的数组
int *p1[10];        // p1 是一个含有10个指针的数组
int (*p2)[10];      // p2 是一个指针,它指向含有10个整数的数组

Type 表示元素类型,dimension 表示数组的大小。(*function(parameter_list))两端的括号必须存在,如果没有这对括号,函数的返回类型将是指针的数组。

示例如下:

Type (*function(parameter_list))[dimension]

可以按照如下的顺序来逐层理解该声明的含义:

  • func(int i) 表示调用 func 函数时需要一个 int 类型的实参
  • (*func(int i)) 意味着我们可以对函数调用的结果执行解引用操作
  • (*func(int i))[10] 表示解引用 func 的调用将得到一个大小是10的数组
  • int (*func(int i))[10] 表示数组中的元素是 int 类型

2.2 使用尾置返回类型

上述传统的定义形式如果不能很好的理解的话,非常容易搞错,我们再来看看使用尾置返回类型如何定义:

int (*func(int i))[10];

当我们把函数的返回类型放在了形参列表之后,就可以很清楚地看到func函数返回的是一个指针,并且该指针指向了含有10个整数的数组。

三、尾置返回类型的应用

C++11 标准中位置返回类型的作用之一就是推导函数模板的返回类型,当然了前提是需要用到decltype说明符,例如:

#include <iostream>

using namespace std;

template<class T1, class T2>
auto sum(T1 t1, T2 t2) -> decltype(t1 + t2)
{
    return t1 + t2;
}

int main()
{
    auto s1 = sum(2, 3);
    cout << "sum(2, 3)=" << s1 << endl;
    cout << "s1 type: " << typeid(s1).name() << endl;

    auto s2 = sum(2.0, 3.0);
    cout << "sum(2.0, 3.0)=" << s2 << endl;
    cout << "s2 type: " << typeid(s2).name() << endl;

    return 0;
}

四、总结

C++11 标准引入的尾置返回类型,可以让返回复杂类型的函数声明更加清晰易读。在无法使用C++14 标准的情况下,通过尾置返回类型的语法来推导函数模板的返回类型无疑是最简便的方法。

注意,在引入C++14 标准后,C++14 标准支持对返回类型声明为auto的推导。

参考文献:

《C++ Primer第五版》

《现代C++语言核心特性解析》

到此这篇关于C++11引入的尾置返回类型的文章就介绍到这了,更多相关C++11尾置返回类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++11之后的decltype类型指示符详解

    目录 一.什么是decltype类型指示符 二.typeid运算符 三.使用decltype指示符 四.decltype和引用 五.decltype(auto) 六.本章代码汇总 一.什么是decltype类型指示符 有时会遇到这种情况:希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量.为了满足这一要求,C++11 新标准引入了另一种类型说明符 decltype ,它的作用是选择并返回操作数的数据类型.在此过程中,编译器分析表达式并得到它的类型,却并不实际计算表达式的

  • C++11中移动构造函数案例代码

    目录 1. 拷贝构造函数中的深拷贝问题 2. C++移动构造函数(移动语义的具体实现) 1. 拷贝构造函数中的深拷贝问题 在 C++ 98/03 标准中,如果想用其它对象初始化一个同类的新对象,只能借助类中的拷贝构造函数.拷贝构造函数的实现原理很简单,就是为新对象复制一份和其它对象一模一样的数据.需要注意的是,当类中拥有指针类型的成员变量时,拷贝构造函数中需要以深拷贝(而非浅拷贝)的方式复制该指针成员. 举个例子: #include <iostream> using namespace std

  • 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 main()

  • C++11 中的override详解

    目录 1 公有继承 1.1 纯虚函数 (pure virtual) 1.2 普通虚函数 1.2.1 方法一 1.2.2 方法二 1.3 非虚函数 2 重写 (override) 小结: 参考资料 1 公有继承 公有继承包含两部分:一是"函数接口" (interface),二是"函数实现" (implementation) 如 Shape 类中,三个成员函数,对应三种继承方式: class Shape { public: virtual void Draw() con

  • TypeScript 内置高级类型编程示例

    目录 TypeScript 类型编程 TypeScript 内置高级类型 Pick<Type, Keys> Exclude<UnionType, ExcludedMembers> ReturnType<Type> 更多类型体操学习 TypeScript 类型编程 TypeScript 的类型系统,最基本的是简单对应 JavaScript 的 基本类型,比如 string.number.boolean 等,然后是新增的 tuple.enum.复合类型.交叉类型.索引类型等

  • JAVA利用泛型返回类型不同的对象方法

    有时需要在方法末尾返回类型不同的对象,而return 语句只能返回一个或一组类型一样的对象.此时就需要用到泛型. 首先先解释个概念, 元组:它是将一组对象直接打包存储于其中的一个单一对象,这个容器对象允许读取其中元素,但不能修改. 利用泛型创建元组 public class ReturnTwo<A,B> { public final A first; public final B second; public ReturnTwo(A a,B b) { first = a; second = b

  • C# web api返回类型设置为json的两种方法

    web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Application_Start()方法中添加一句: 复制代码 代码如下: GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 修改后: 复制代码 代码如下: protected void

  • java协变返回类型使用示例

    Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基类方法返回类型的子类.协变返回类型允许返回更为具体的类型.示例程序如下: 复制代码 代码如下: import java.io.ByteArrayInputStream;import java.io.InputStream; class Base{    //子类Derive将重写此方法,将返回类型设置为InputStream的子类   public InputStream getInput()   { 

  • mybatis中查询结果为空时不同返回类型对应返回值问题

    今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同类型,查询结果为空时dao接口的返回值是一样的吗?接下来我就总结一下常见的几种情况. 第一种:resultType为基本类型,如string(在此暂且把string归纳为基本类型) 如果select的结果为空,则dao接口返回结果为null 第二种,resultType为基本类型,如int 后台报异

  • python ctypes库2_指定参数类型和返回类型详解

    python函数的参数类型和返回类型默认为int. 如果需要传递一个float值给dll,那么需要指定参数的类型. 如果需要返回一个flaot值到python中,那么需要指定返回数据的类型. 数据类型参考python文档: https://docs.python.org/3.6/library/ctypes.html#fundamental-data-types import ctypes path = r'E:\01_Lab\VisualStudioLab\cpp_dll\cpp_dll\De

  • JPA如何使用entityManager执行SQL并指定返回类型

    下面是代码 Query query = entityManager.createNativeQuery(yourSql); //指定返回类型 query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(yourClass)); //获取返回集合 List resultList = query.getResultList(); 注:此方法不支持枚举类的自动转型,需要在entity中改一下枚举类的set方法.

  • MyBatis在DAO层定义接口返回类型泛型无效的解决

    MyBatis DAO层定义接口返回类型泛型无效 今天很偶然的因为一次粗心而发现的一个mybatis问题,这里就写出来与大家分享一下. DAO层定义了一个接口,返回String集合,用于获取最热门的搜索信息. mapper.xml文件接口返回的类型却是search对象. 调用接口,返回的是search对象集合,没有报错,泛型没起到作用. 仔细一想,泛型是在编译阶段将我们的返回值类型匹配到一具体类型,而DAO层的接口却没有具体的返回值信息,所以在编译阶段它是可以通过的,这也就是说我们在DAO层定义

  • 详解MyBatis resultType与resultMap中的几种返回类型

    目录 一.返回集合 1.返回JavaBean集合 2.返回 Map 集合 二.返回 Map 1.一条记录 2.多条记录,需要指定 Map 的 Key 和 Value 的类型 三.返回 resultMap 自定义结果集封装 1.自定义 JavaBean 的封装 2.关联查询的封装,一对一,JavaBean 属性包含 JavaBean 3.关联查询的封装,一对多,JavaBean 属性包含 JavaBean 的集合 4.鉴别器discriminator 一.返回集合 1.返回JavaBean集合 p

随机推荐