C ++中的返回类型推导14

时间:2015-02-13 11:10:24

标签: c++ c++14

我刚刚读到了名为&#34的新功能;返回类型扣除"在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
}

我的问题是: 为什么当我将Wrong(int i)更改为Wrong(auto i)时,Wrong函数开始编译?隐藏在这个微小变化背后的是什么?

1 个答案:

答案 0 :(得分:7)

我认为这是GCC实现其对C ++ 14 auto的扩展的一个错误。这是一个似乎有用的程序:

auto f(auto i) {
  return "";
}

int main() {
  const char *s = f(1);
  return 0;
}

它不起作用,它失败了"错误:从'int'无效转换为'const char *'"因为GCC由于某种原因确定返回类型必须与参数类型相同。

同样的错误可以使代码被拒绝,例如你问题中的内容,编译没有问题。

当然,这个bug不会影响一致性,因为没有有效的C ++ 14程序可以在lambdas之外使用auto个参数。

由于bug #64969,恰好在一周前向GCC开发人员报告了another question on SO about it