¿Por qué usar el nombre de la función como un puntero a la función equivale a aplicar la dirección del operador al nombre de la función?

Es interesante queusar el nombre de la función como un puntero a la función es equivalente a aplicar la dirección del operador al nombre de la función!

Aquí está el ejemplo.

typedef bool (*FunType)(int);
bool f(int);
int main() {
  FunType a = f;
  FunType b = &a; // Sure, here's an error.
  FunType c = &f; // This is not an error, though. 
                  // It's equivalent to the statement without "&".
                  // So we have c equals a.
  return 0;
}

Usar el nombre es algo que ya sabemos en la matriz. Pero no puedes escribir algo como

int a[2];
int * b = &a; // Error!

Parece que no es consistente con otras partes del lenguaje. ¿Cuál es la razón de este diseño?

Esta pregunta explica la semántica de tal comportamiento y por qué funciona. Pero estoy interesado en por qué el lenguaje fue diseñado de esta manera.

Lo que es más interesante es que el tipo de función se puede convertir implícitamente en puntero a sí mismo cuando se usa como parámetro, ¡pero no se convertirá en un puntero a sí mismo cuando se usa como tipo de retorno!

Ejemplo:

typedef bool FunctionType(int);
void g(FunctionType); // Implicitly converted to void g(FunctionType *).
FunctionType h(); // Error!
FunctionType * j(); // Return a function pointer to a function 
                    // that has the type of bool(int).

Respuestas a la pregunta(3)

Su respuesta a la pregunta