Return C++14 中的类型推导
Return type deduction in C++14
我刚刚阅读了 C++14 中可用的名为 "return type deduction" 的新功能,我对该类型函数的递归有疑问。我了解到该函数中的第一个 return 必须允许推断 return 类型。
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
}
我的问题是:
为什么当我将 Wrong(int i)
更改为 Wrong(auto i)
时,Wrong
函数开始编译?这个小小的改变背后隐藏着什么?
我认为这是 GCC 对 C++14 auto
的扩展实现中的一个错误。这是一个似乎旨在工作的程序:
auto f(auto i) {
return "";
}
int main() {
const char *s = f(1);
return 0;
}
它不起作用,失败并显示 "error: invalid conversion from ‘int’ to ‘const char*’" 因为 GCC 出于某种原因确定 return 类型必须与参数类型相同。
同样的 bug 可以使本应被拒绝的代码(例如您的问题中的内容)编译没有问题。
当然,这个错误不会影响一致性,因为没有有效的 C++14 程序可以在 lambdas 之外使用 auto
参数。
它恰好在大约一周前作为 bug #64969, as a result of 向 GCC 开发人员报告。
我刚刚阅读了 C++14 中可用的名为 "return type deduction" 的新功能,我对该类型函数的递归有疑问。我了解到该函数中的第一个 return 必须允许推断 return 类型。
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
}
我的问题是:
为什么当我将 Wrong(int i)
更改为 Wrong(auto i)
时,Wrong
函数开始编译?这个小小的改变背后隐藏着什么?
我认为这是 GCC 对 C++14 auto
的扩展实现中的一个错误。这是一个似乎旨在工作的程序:
auto f(auto i) {
return "";
}
int main() {
const char *s = f(1);
return 0;
}
它不起作用,失败并显示 "error: invalid conversion from ‘int’ to ‘const char*’" 因为 GCC 出于某种原因确定 return 类型必须与参数类型相同。
同样的 bug 可以使本应被拒绝的代码(例如您的问题中的内容)编译没有问题。
当然,这个错误不会影响一致性,因为没有有效的 C++14 程序可以在 lambdas 之外使用 auto
参数。
它恰好在大约一周前作为 bug #64969, as a result of