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

 更新时间:2023年01月10日 10:53:26   作者:smart_cat  
C++11 标准引入的尾置返回类型,可以让返回复杂类型的函数声明更加清晰易读,在无法使用C++14 标准的情况下,通过尾置返回类型的语法来推导函数模板的返回类型无疑是最简便的方法,这篇文章主要介绍了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 <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;
}

20230109221937

四、总结

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

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

参考文献:

《C++ Primer第五版》

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

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

相关文章

  • C语言打印某一年的日历

    C语言打印某一年的日历

    这篇文章主要为大家详细介绍了C语言打印某一年的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 使用C语言中的time函数获取系统时间

    使用C语言中的time函数获取系统时间

    在C语言中可以使用time函数来获取系统时间,以下对time函数进行了介绍,需要的朋友可以过来参考下
    2013-07-07
  • 总结C/C++面试中可能会碰到的字符串指针题

    总结C/C++面试中可能会碰到的字符串指针题

    C/C++是最能体现程序员能力的语言之一,其功能强大,在IT行业的各个方面都有大量的应用。下面这篇文章主要介绍了总结了在C/C++面试中可能会碰到的字符串指针题,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • C语言如何实现图片文件的复制

    C语言如何实现图片文件的复制

    这篇文章主要为大家详细介绍了C语言中实现图片文件的复制的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Opencv图像处理之轮廓外背景颜色改变

    Opencv图像处理之轮廓外背景颜色改变

    这篇文章主要为大家详细介绍了Opencv图像处理之轮廓外背景颜色改变,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • C语言实现冒泡排序的思路以及过程

    C语言实现冒泡排序的思路以及过程

    冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • sqlserver,sqlite,access数据库链接字符串整理

    sqlserver,sqlite,access数据库链接字符串整理

    本节主要整理sqlserver,sqlite,access数据库链接字符串,有需要的朋友可以参考下
    2014-07-07
  • C语言游戏项目球球大作战实现流程

    C语言游戏项目球球大作战实现流程

    这篇文章主要为大家详细介绍了如何用C语言实现流行游戏球球大作战,文中示例代码介绍的非常详细,如果过程中有问题在文末还有视频讲解,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • GetChar缓存机制深入剖析

    GetChar缓存机制深入剖析

    以下是对GetChar缓存机制进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++中四种强制转换方式的区别

    C++中四种强制转换方式的区别

    在C++中,有四种不同的强制转换方式,它们分别是静态转换、动态转换、常量转换和重新解释转换,下面通过示例代码讲解每种转换的区别,感兴趣的朋友跟随小编一起看看吧
    2023-08-08

最新评论