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

一、什么是尾置返回类型(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 

using namespace std;

template
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如何引入的尾置返回类型_第1张图片

四、总结

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

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

参考文献:

《C++ Primer第五版》

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

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

你可能感兴趣的:(C++11如何引入的尾置返回类型)