On the one hand, according to the C Standard (6.3.2.1 Lvalues, arrays, and function designators)
4 A function designator is an expression that has function type. Except
when it is the operand of the sizeof operator65) or the unary &
operator, a function designator with type ‘‘function returning type’’
is converted to an expression that has type ‘‘pointer to function
returning type’’.
and according to the C++ Standard (4.3 Function-to-pointer conversion)
1 An lvalue of function type T can be converted to a prvalue of type
“pointer to T.” The result is a pointer to the function
On the other hand according to the C Standard(6.5.3.2 Address and indirection operators)
4 The unary * operator denotes indirection. If the operand points to
a function, the result is a function designator;
and the C++ Standard (5.3.1 Unary operators)
1 The unary * operator performs indirection: the expression to which
it is applied shall be a pointer to an object type, or a pointer to a
function type and the result is an lvalue referring to the object or
function to which the expression points. If the type of the
expression is “pointer to T,” the type of the result is “T.”
Thus there are recursive conversions.at first from the function designator to pointer and then from the pointer to the function designator (or as written in the C++ Standard to lvalue referring the function) and again from the function designator or lvalue to function pointer and so on.