在函数声明后面,"->"是什么意思?

41

在一个系统头文件中,我看到了这样的表达式:

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{…}

我不知道“->”是什么意思,它既不是指针表达式也不是lambda表达式,有人能帮我吗?


4
顺便提一下,如果要在谷歌上搜索的话,应该使用“尾置返回类型”这个术语。 - chris
1个回答

58
这是C++11的新函数声明语法,称为“尾随返回类型”。在函数声明末尾,->表示后面是函数的返回类型。只能在使用auto关键字而不是实际返回类型的情况下使用它。例如,下面这两个声明是兼容的:
int foo();
auto foo() -> int;

根据您的喜好,您可能会发现它比旧的声明语法更漂亮,特别是当返回类型非常长/复杂时:

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param);
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;

但有时候使用模板是必要的,因为函数的返回类型可能会随着参数而变化。

比如说你想要一个能够添加变量的模板函数:

template<typename T>
T add(const T& x, const T& y)
{
    return x + y;
}

这很好,但是你只能添加相同类型的变量。假设您想要能够添加任何类型的变量(例如add((int)1, (double)2))。

template<typename T, typename U>
??? add(const T& x, const U& y)
{
    return x + y;
}
编辑:请注意,在C++14及以上版本中,对于函数定义(也就是当您定义函数体时),可以写成auto add(const T& x, const U& y),无需尾随返回类型。
问题在于你无法预先知道x + y的结果类型。因为模板可以使用非整数类型。 (您想能够执行add(std::string("x"), "y")吗?) Decltype与新的函数声明语法一起,让您可以解决这个问题。
template<typename T, typename U>
auto add(const T& x, const U& y) -> decltype(x + y)
{
    return x + y;
}

Decltype "返回"一个表达式的类型。由于您需要声明xy才能使decltype(x + y)工作,因此您需要新语法。


即使有常规返回类型,您也可以访问参数类型,因为模板参数始终是首先声明的。您无法访问的是参数名称,甚至函数名称。 - Luc Danton
为什么decltype(x + y) add(const T& x, const U& y)不能工作呢? - Coloured Panda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接