不懂就问,函数声明后的“ - >”是什么语法?

2023-10-23 18:25:53 浏览数 (2)

小伙伴们大家好,我是飞宇。

群内有小伙伴问了我这样一个问题"函数声明后的“ - >”是什么??"

我依稀记得这是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))。

代码语言:javascript复制
template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x   y; 
}

问题是你不能事先告诉x y的结果类型将是什么。作为模板,它们甚至可以是非整数类型。(难道你不能这样做add(std::string("x"), "y")?)

Decltype,以及新的函数声明语法,让你解决这个问题。

代码语言:javascript复制
template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x   y) 
{ 
    return x   y; 
}

Decltype“返回”表达式的类型。由于您需要xy已宣布为decltype(x y)才能正常工作,因此您需要新的语法。

0 人点赞