This is a follow-up up of this question.
In the comments and in the answer it is said more than once that void{}
is neither a valid type-id nor a valid
To me it sounds like someone messed up merging the previous standard with the new one.
Previously the standard said this: (C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):
When a [...]
return
statement occurs in a function declared with a return type that contains a placeholder type, the deduced return type or variable type is determined from the type of its initializer. In the case of areturn
with no operand, the initializer is considered to bevoid()
.
The newer standard allows for if constexpr
statements, so the language needed to change to reflect that. if constexpr
leads to the concept of a potentially discarded return
statement (if the return
is in the not-taken branch of a constexpr if, then it's discarded and the return type is inferred from other return statements, if any).
Probably the new wording should be something like:
for a non-discarded return statement that occurs in a function declared with a return type that contains a placeholder type,
T
is the declared return type ande
is the operand of thereturn
statement. If the return statement has no operand, thenT
isauto
and the deduced return type isvoid
Confirmed the bug. Already fixed.
Here is the discussion (pretty short to be honest).
So, the answer is - no, void{}
is not legal.
It was a wording bug of the working draft.