When you write int fun2(int fun())
, the parameter int fun()
converts into int (*fun)()
, it becomes exactly equivalent to this:
int fun2(int (*fun)());
A more famiiar conversion happens in case of array when you declare it as function parameter. For example, if you've this:
int f(int a[100]);
Even here the parameter type converts into int*
, and it becomes this:
int f(int *a);
The reason why function type and array type converts into function pointer type, and pointer type, respectively, is because the Standard doesn't allow function and array to be passed to a function, neither can you return function and array from a function. In both cases, they decay into their pointer version.
The C++03 Standard says in §13.1/3 (and it is same in C++11 also),
Parameter declarations that differ only in that one is a function type and the other is a pointer to the same function type are equivalent. That is, the function type is adjusted to become a pointer to function type (8.3.5).
And a more interesting discussion is here:
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…