Когда вы пишете int fun2(int fun())
, параметр int fun()
преобразуется в int (*fun)()
, он становится в точности эквивалентным этому:
int fun2(int (*fun)());
Более подробное преобразование происходит в случае массива, когда вы объявляете его как параметр функции. Например, если у вас есть это:
int f(int a[100]);
Даже здесь тип параметра преобразуется в int*
, и он становится таким:
int f(int *a);
Причина, по которой тип функции и тип массива преобразуются в функцию тип указателя и тип указателя соответственно, заключается в том, что стандарт не позволяет передавать функцию и массив в функцию, вы также не можете вернуть функцию и массив из функции. В обоих случаях они переходят в свою версию указателя.
Стандарт C ++ 03 говорит в §13.1 / 3 (и то же самое в C ++ 11 также),
Объявления параметров, отличающиеся только тем, что один является типом функции, а другой является указателем на один и тот же тип функции, эквивалентен . То есть тип функции настраивается, чтобы стать указателем на тип функции (8.3.5) .
И более интересное обсуждение здесь: