函数声明后的“ - >”是什么?
这种语法的优势之一是可以在函数的返回类型中使用函数参数,使得返回类型更灵活。
先来看一个使用尾返回类型的例子:
#include <iostream>
auto add(int a, int b) -> int
{
return a + b;
}
int main()
{
std::cout << add(3, 4) << std::endl; // 输出 7
return 0;
}
在这个例子中,add 函数声明使用了尾返回类型,通过 -> int 指定了函数的返回类型为 int。这种语法的优势之一是可以在函数的返回类型中使用函数参数,使得返回类型更灵活。
需要注意的是,尾返回类型通常在函数定义的时候使用,而不是在函数声明的时候。
这是来自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;
}
问题是你不能事先告诉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
“返回”表达式的类型。由于您需要x
和y
已宣布为decltype(x + y)
才能正常工作,因此您需要新的语法。