【问题标题】:Why can't gcc deduce the return value type after parsing the first return clause?为什么gcc解析第一个return子句后不能推断出返回值类型?
【发布时间】:2021-01-04 09:53:24
【问题描述】:

为什么此代码无效?

auto f() {
  if (true) return 0;
  return {};
}

解析0后,我想gcc应该知道函数f的返回类型是int,但是在解析最终的return子句时还是把{}解释为initializer_list,为什么?

【问题讨论】:

  • 即使该代码是有效的,它肯定会让人类读者感到困惑。如果你生成这样的 C++ 代码,你可以改进生成器。最后GCCfree software。你可以改进它
  • 大括号括起来的列表没有类型,在推断的上下文中它们总是std::initializer_lists。仅仅因为某些东西可以工作并不意味着它已经被实施或者它是一个好主意。这对我来说似乎毫无用处。
  • @BasileStarynkevitch:有几个令人困惑的有效/合法代码。这不是 gcc 的错误,所以这里没有什么可以改变的。这个问题是有效的(即使“标准的哪个部分禁止这样的构造?”和“为什么标准禁止这样的构造?”之间几乎没有歧义)。

标签: c++ return c++20 initializer-list type-deduction


【解决方案1】:

来自function#Return_type_deduction

如果有多个return语句,它们必须都推导到相同的类型

如果return语句使用大括号初始化列表,则不允许扣除:

禁止此类构造。

一旦在函数中看到 return 语句,从该语句推导出的返回类型就可以在函数的其余部分中使用,包括在其他 return 语句中。

只允许递归重用函数。

【讨论】:

  • 最后一句话中的can be used指的是什么?在这里断章取义,听起来问题中的代码应该没问题。
  • @super:主要是允许递归调用auto fact(int n) { if (n < 2) return 1; return n * fact(n - 1); }有效。 (而auto fact(int n) { if (n >= 2) return n * fact(n - 1); return 1;} 不是)。一旦我们遇到第一次返回,我们可能会假设返回类型,但其他规则仍然适用:一致的返回类型和没有return {..}
猜你喜欢
  • 2018-11-13
  • 2021-07-17
  • 2023-03-18
  • 2013-12-20
  • 1970-01-01
  • 2016-11-05
  • 2012-01-15
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多