Dlaczego używanie nazwy funkcji jako wskaźnika funkcji odpowiada zastosowaniu operatora adresu do nazwy funkcji?

To ciekaweużycie nazwy funkcji jako wskaźnika funkcji jest równoznaczne z zastosowaniem operatora adresu do nazwy funkcji!

Oto przykład.

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;
}

Używanie nazwy to coś, co już wiemy w tablicy. Ale nie możesz napisać czegoś takiego

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

Wydaje się, że nie jest zgodny z innymi częściami języka. Jakie jest uzasadnienie tego projektu?

To pytanie wyjaśnia semantykę takiego zachowania i dlaczego to działa. Ale interesuje mnie, dlaczego język został zaprojektowany w ten sposób.

Co bardziej interesujące, typ funkcji może być niejawnie konwertowany na wskaźnik do siebie, gdy jest używany jako parametr, ale nie będzie konwertowany na wskaźnik do siebie podczas używania jako typu zwracanego!

Przykład:

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).