As with arrays (§ 6.3.3, p. 228), we can’t return a function type but can return a pointer to a function type. Similarly, we must write the return type as a pointer type; the compiler will not automatically treat a function return type as the corresponding pointer type. Also as with array returns, by far the easiest way to declare a function that returns a pointer to function is by using a type alias:
using F = int(int*, int); // F is a function type, not a pointer
using PF = int(*)(int*, int); // PF is a pointer type
Here we used type alias declarations (§ 2.5.1, p. 68) to define F
as a function type and PF
as a pointer to function type. The thing to keep in mind is that, unlike what happens to parameters that have function type, the return type is not automatically converted to a pointer type. We must explicitly specify that the return type is a pointer type:
PF f1(int); // ok: PF is a pointer to function; f1 returns a pointer to function
F f1(int); // error: F is a function type; f1 can't return a function
F *f1(int); // ok: explicitly specify that the return type is a pointer to function
Of course, we can also declare f1
directly, which we’d do as
int (*f1(int))(int*, int);
Reading this declaration from the inside out, we see that f1
has a parameter list, so f1
is a function. f1
is preceded by a *
so f1
returns a pointer. The type of that pointer itself has a parameter list, so the pointer points to a function. That function returns an int
.
For completeness, it’s worth noting that we can simplify declarations of functions that return pointers to function by using a trailing return (§ 6.3.3, p. 229):
auto f1(int) -> int (*)(int*, int);