Интересно, что , используя имя функции в качестве указателя на функцию, эквивалентно применению адреса оператора к имени функции!
Вот пример.
typedef bool (*FunType)(int);
bool f(int);
int main() {
FunType a = f;
FunType b = &a; // Sure, here an error.
FunType c = &f; // This is not an error, though.
// It equivalent to the statement without "&".
// So we have c equals a.
return 0;
}
Использование имени - это то, что мы уже знаем в массиве. Но вы не можете написать что-то вроде
int a[2];
int * b = &a; // Error!
Кажется, это не соответствует другим частям языка. Какое обоснование этого дизайна?
Этот вопрос объясняет семантику такого поведения и почему он работает. Но меня интересует, почему язык был разработан таким образом.
Что более интересно, тип функции может быть неявно преобразован в указатель на себя при использовании в качестве параметра, но не будет преобразован в указатель на себя при использовании в качестве возвращаемого типа!
Пример:
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).