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

8
我刚刚了解到C++14中推出的新特性“返回类型推断”,并且对此类函数中的递归有疑问。我了解到该函数的第一个返回值必须允许自动推导返回类型。
维基百科提供的例子完全符合这个规则。
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 函数开始编译了?这个小改变背后隐藏着什么?

5
基本上,你将 Wrong 转换成了一个函数模板。 - danielschemmel
8
在常规函数中使用auto作为参数是GCC的扩展,不是标准C++14。 - user3920237
无法编译 - Bryan Chen
如果将 auto i 更改为常规模板函数 (template <typename T> auto Wrong(T i)),它再次被拒绝。 - user743382
1个回答

7

我认为这是GCC实现C++14的auto扩展时出现的一个bug。下面是一个看起来应该正常工作的程序:

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

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

它不能工作,因为GCC确定返回类型必须与参数类型相同。因此出现了“error: invalid conversion from ‘int’ to ‘const char*’”错误。

同样的错误可能会使代码编译通过,即使代码本应该被拒绝,就像你问题中的代码一样。

当然,这个错误并不影响符合性,因为在lambda外部没有任何有效的C++14程序可以使用auto参数。

这个错误大约一周前被报告给GCC开发人员,作为bug #64969,源自关于其的另一个SO问题


类似的问题在这里(指向你的答案,而不是这个问题)。 - user3920237
@remyabel 谢谢。我也在查看错误报告,但是我在那里找不到任何东西。 - user743382
如果你愿意深入研究TS的概念,你可能可以确定GCC的行为是有缺陷还是“符合规范”的。现在它们被称为“缩写函数模板”。 - user3920237
@remyabel 我在N4333中找到的唯一信息是函数参数auto类型被替换为虚构的模板参数。我没有看到任何关于在函数参数之外更改auto的提及。但是,由于其中没有任何将auto参数与auto返回类型组合的示例,这并没有什么帮助。 - user743382
@Casey同意,但GCC并没有声称实现它,而且N4377中有很多GCC根本没有实现的内容,不仅仅是错误的。 - user743382
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接