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 开发人员报告。