This is immediately given in the clause describing function definitions:
6.9.1 Function definitions
Constraints2 - The identifier declared in a function definition (which is the name of the function) shall have a function type, as specified by the declarator portion of the function definition.141)
141) The intent is that the type category in a function definition cannot be inherited from a typedef [...]
The way this works is that under declarators (6.7.5), the only function declarators (6.7.5.3) are those with parentheses after the identifier:
T D(
parameter-type-list)
T D(
identifier-listopt)
So, if the function is defined via a typedef then it does not have the syntactic form of a function declarator and so is invalid by 6.9.1p2.
It may help to consider the syntactic breakdown of an attempted typedef function definition:
typedef int F(void);
F f {}
| | ^^-- compound-statement
| ^-- declarator
^-- declaration-specifiers
Note that the typedef type F
is part of the declaration-specifiers and not part of the declarator, and so f
(the declarator portion) does not have a function type.