为什么gcc解析第一个return子句后不能推导出返回值类型?

康桓瑋*_*康桓瑋 1 c++ return initializer-list type-deduction c++20

为什么此代码无效?

auto f() {
  if (true) return 0;
  return {};
}
Run Code Online (Sandbox Code Playgroud)

解析后0,我认为gcc应该知道函数的返回类型fint,但它仍然解释{}initializer_list解析最终返回子句时,为什么?

Jar*_*d42 5

函数#Return_type_deduction

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

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

其中禁止这种构造。

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

只允许递归地重用该函数。

  • @super:主要是允许递归调用 `auto fact(int n) { if (n < 2) return 1; 返回 n * 事实(n - 1); }` 有效。(而 `auto fact(int n) { if (n >= 2) return n * fact(n - 1); return 1;}` 则不是)。一旦我们遇到第一个返回,我们可能会假设返回类型,但其他规则仍然适用:一致的返回类型并且没有“return {..}”。 (2认同)