【问题标题】:Return type deduction in C++14C++14 中的返回类型推导
【发布时间】:2015-02-13 11:10:23
【问题描述】:

我刚刚阅读了有关 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 函数开始编译?这个小小的变化背后隐藏着什么?

【问题讨论】:

  • 基本上,你把Wrong变成了一个函数模板。
  • auto 作为常规函数中的参数是 GCC 扩展,而不是标准 C++14。
  • 如果将auto i 更改为常规模板函数(template <typename T> auto Wrong(T i)),则会再次被拒绝。

标签: c++ c++14


【解决方案1】:

我相信这是 GCC 对 C++14 的auto 的扩展实现中的一个错误。这是一个似乎可以工作的程序:

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

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

它不起作用,它失败并显示“错误:从 'int' 到 'const char*' 的无效转换”,因为 GCC 出于某种原因确定返回类型必须与参数类型相同。

同样的错误可以使本应被拒绝的代码(例如您的问题中的内容)编译时没有问题。

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

由于another question on SO about it,它恰好在大约一周前以bug #64969 的形式向GCC 开发人员报告。

【讨论】:

  • 类似问题here(对你的回答,不是这个问题。)
  • @remyabel 谢谢。我也在查看错误报告,但在那里找不到任何东西。
  • 如果您愿意筛选 TS 的概念,您可能可以确定 GCC 的行为是错误的还是“符合标准的”。它们现在被称为“缩写函数模板”。
  • @remyabel 我在 N4333 中唯一能找到的是函数参数 auto 类型被发明的模板参数替换。我没有看到任何提及 auto 在函数参数之外被更改。但是没有任何示例将 auto 参数与 auto 返回类型结合起来,这并没有帮助。
  • GCC 的行为不符合N4377 Programming Languages — C++ Extensions for Concepts (the PDTS) [dcl.funct]:声明auto foo(auto bar) 等价于template<typename T> auto foo(T bar)。返回类型中的占位符不受影响。
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多