Почему использование имени функции в качестве указателя на функцию эквивалентно применению оператора адреса к имени функции?

Интересно, чтоusing the function name as a function pointer is equivalent to applying the address-of operator to the function name!

Вот пример.

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

Использование имени - это то, что мы уже знаем в массиве. Но вы не можете написать что-то вроде

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

Кажется, это не согласуется с другими частями языка. Каково обоснование этого дизайна?

Этот вопрос объясняет семантику такого поведения и почему оно работает. Но меня интересует, почему язык был разработан таким образом.

Более интересным является то, что тип функции может быть неявно преобразован в указатель на себя при использовании в качестве параметра, но не будет преобразован в указатель на себя при использовании в качестве возвращаемого типа!

Example:

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

Ответы на вопрос(3)

Ваш ответ на вопрос