Cuando se escribe int fun2(int fun())
, el parámetro int fun()
convierte en int (*fun)()
, se hace exactamente equivalente a esto:
int fun2(int (*fun)());
Una conversión más famiiar sucede en el caso de la matriz cuando se declara como parámetro de la función. Por ejemplo, si has esto:
int f(int a[100]);
Incluso en este caso el tipo de parámetro se convierte en int*
, y se convierte en esto:
int f(int *a);
La razón por la cual el tipo de función y tipo de matriz se convierte en la función de puntero tipo, y el tipo de puntero, respectivamente, es porque el estándar no permite que la función y la matriz se pasen a una función, tampoco se puede devolver la función y la matriz de una función. En ambos casos, decaen en su versión de puntero.
El C++ 03 Standard dice en §13.1/3 (y es igual en C++ 11 también),
declaraciones de parámetros que difieren solamente en que uno es un tipo de función y el otro es un puntero al mismo tipo de función son equivalente. Es decir, el tipo de función se ajusta para convertirse en un puntero al tipo de función (8.3.5).
Y una discusión más interesante está aquí:
Esto es válido en C, C99 estricto, C++ 03 y C++ 11. Y estoy sorprendido –