[expr.call]/1 (emphasis is mine):

A function call is a postfix expression followed by parentheses containing a possibly empty, comma-separated list of initializer-clauses which constitute the arguments to the function.
The postfix expression shall have function type or function pointer type.
For a call to a non-member function or to a static member function, the postfix expression shall either be an lvalue that refers to a function (in which case the function-to-pointer standard conversion ([conv.func]) is suppressed on the postfix expression), or have function pointer type.

My impression reading this paragraph is that the sentence "have a function pointer type" is referring to an lvalue having function to pointer type, not to a prvalue obtained from a function call returning a pointer to function.

Thus, I don't think [expr.call]/1 correctlly allows the following snippet to compile (demo):


void f(int a) {
    std::cout << "f(" << a << ")\n";

// g is a function of () returning a pointer to a function of (int) returning void

void(*g())(int) {
    return f; // f is function of (int) returning void.

int main()
   g()(1);  // The expression g() has type pointer to function, but is a prvalue.