我刚刚读到了C++ 14中提供的名为"返回类型推导"的新功能,我对该类型函数的递归有疑问.我已经了解到,该函数的第一次返回必须允许推导返回类型.
Wiki提供的示例完全符合该规则.
auto Correct(int i) {
if (i == 1)
return i; // return type deduced as int
else
return Correct(i-1)+i; // ok to call it now
}
auto Wrong(int i) {
if (i != 1)
return Wrong(i-1)+i; // Too soon to call this. No prior return statement.
else
return i; // return type deduced as int
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么当我换Wrong(int i)到Wrong(auto i),Wrong功能开始编制?隐藏在这个微小变化背后的是什么?
小智 7
我相信这是GCC实现其C++ 14扩展的一个错误auto.这是一个似乎有用的程序:
auto f(auto i) {
return "";
}
int main() {
const char *s = f(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,它失败了"错误:从'int'到'const char*'的无效转换",因为GCC由于某种原因确定返回类型必须与参数类型相同.
同样的错误可以使代码被拒绝,例如你的问题中的代码,编译没有问题.
当然,这个bug不会影响一致性,因为没有有效的C++ 14程序可以使用autolambda之外的参数.
它恰好在一周前被GCC开发人员报告为bug#64969,这是关于它的另一个问题的结果.