网站页面引导怎么做徐州人才网最新招聘2021
这种语法的优势之一是可以在函数的返回类型中使用函数参数,使得返回类型更灵活。
先来看一个使用尾返回类型的例子:
#include <iostream>
auto add(int a, int b) -> int
{return a + b;
}int main() 
{std::cout << add(3, 4) << std::endl;  // 输出 7return 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)才能正常工作,因此您需要新的语法。
