在上一篇学习笔记中提到了Lambda表达式可以使用auto形参和返回类型,但普通函数不能使用auto形参。
虽然普通函数不能使用auto形参,但可以使用返回类型推导。在C++11中我们可以使用后置返回类型推导来完成这件事情:
//代码2.1
//C++11中使用后置返回类型推导
auto add(int x, int y) ->decltype(x + y)
{
return x + y;
}
而在C++14中,我们可以省略decltype,编译器直接由return语句的值推导出返回类型:
//代码2.2
//C++14中不需要后置decltype
auto add(int x, int y)
{
return x + y;
}
如果有多条return语句,则它们的返回类型必须相同,否则编译器报错:
//代码2.3
auto PI(bool fract)
{
if (fract) return 3.1416;
else return 3; //错误:推导出来的int与之前推导出来的double冲突
}
对于含有递归调用的函数,递归调用必须在第一个return之后,否则编译器在递归调用时还不知道返回类型:
//代码2.4
auto Fibonacci(int n)
{
//错误:Fibonacci的返回类型