小伙伴们大家好,我是飞宇。
群内有小伙伴问了我这样一个问题"函数声明后的“ - >”是什么??"
我依稀记得这是c 11的一个新语法,回看了下《C Primer 5th》后给出了自己的回答,分享一下自己昨天的回答。
这是来自C 11的新函数声明语法,它被称为“尾随返回类型”。在函数声明结束时,->
表示以下是该函数的返回类型。只有在使用auto
关键字而不是您通常期望的实际返回类型时才能使用它。
举例来说,这两个声明是兼容的:
代码语言:javascript复制int foo();
auto foo() -> int;
根据你的口味,你会发现它比旧的声明语法漂亮,尤其是当返回类型是非常长/复杂:
代码语言:javascript复制task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param);
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;
但是有时可能需要使用模板,当函数的返回类型可能随参数而变化时。
说你想要一个模板函数添加变量:
代码语言:javascript复制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)
才能正常工作,因此您需要新的语法。