Search code examples
c++returnc++20initializer-listtype-deduction

Why can't gcc deduce the return value type after parsing the first return clause?


Why this code is not valid?

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

After parsing 0, I think gcc should know that the return type of function f was int, but it still interpret the {} as the initializer_list when parsing the final return clause, why?


Solution

  • From function#Return_type_deduction

    if there are multiple return statements, they must all deduce to the same type

    and

    If the return statement uses a brace-init-list, deduction is not allowed:

    Which prohibit such construct.

    Once a return statement has been seen in a function, the return type deduced from that statement can be used in the rest of the function, including in other return statements.

    only allows to reuse the function recursively.