函数声明后的" - >"是什么?

use*_*282 34 c++ c++11

在一个系统头文件中,我看到如下表达式:

auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>
{...}
Run Code Online (Sandbox Code Playgroud)

我不知道" - >"是什么意思,它不是指针表达式或lambda表达式,任何人都可以帮助我吗?

zne*_*eak 51

它是来自C++ 11的新函数声明语法,它被称为"尾随返回类型".在函数声明的末尾,->表示以下是函数的返回类型.它只能在使用auto关键字而不是您通常期望的实际返回类型时使用.

例如,这两个声明是兼容的:

int foo();
auto foo() -> int;
Run Code Online (Sandbox Code Playgroud)

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

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param);
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;
Run Code Online (Sandbox Code Playgroud)

但有时,当函数的返回类型随参数变化时,可能需要使用模板.

假设您想要一个模板化函数来添加变量:

template<typename T>
T add(const T& x, const T& y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

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

template<typename T, typename U>
??? add(const T& x, const U& y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,在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;
}
Run Code Online (Sandbox Code Playgroud)

Decltype"返回"表达式的类型.由于您需要x并且y已声明decltype(x + y)要工作,因此您需要新语法.