C++ 11 尾置返回类型

发布于 2023-10-07  189 次阅读


C++11 标准中引入了尾置返回类型

int foo()
{
    return 0;
}
可以等价为
auto foo() -> int
{
    return 0;
}

当返回类型比较复杂的时候,返回类型后置可能会是一个不错的选择。任何函数的定义都能使用尾置返回。

尾置返回经典场景

返回数组指针

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

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

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

auto func(int i) -> int(*)[10]

Lambda函数指定返回类型

auto lambdafunc = [](int a,int b) -> double
    {
        return static_cast<double>(a) / b;
    };

推导函数模板类型

需要用到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及以后的标准中,你可以使用不带尾置返回类型的auto来编写函数模板,编译器会根据return语句中的表达式来自动推断返回类型。因此,你的示例代码是合法的,并且编译器会根据xy的类型推断出返回类型。

所以,这个代码不需要尾置返回类型,以下代码是合法的:

template <typename T, typename U>
auto multiply(T x, U y) {
    return x * y;
}