接收函数指针的类型和 returns 函数指针?

Type of function pointer that receives and returns function pointer?

指向 int f(int i) { return i; } 的指针类型是 int (*)(int) - 这很好。另外,如果我设置 using f_ptr = int (*)(int),即 f_ptr 是指向 f() 的指针类型,指向 f_ptr g(f_ptr fp) { return fp; } 的指针类型自然是 f_ptr (*)(f_ptr) - 这也是很好。

如果是这样,我觉得没有 usingf_ptr (*)(f_ptr) 应该是 int (*)(int) (*[variable comes here])(int (*)(int)) 因为,好吧,当你简单地用 [=13= 替换 f_ptr 时你就会得到这个] 因为它是用 using 定义的,但这实际上只会导致语法错误。实际类型是 int (*(*[variable comes here])(int (*)(int)))(int) 但我不明白它是如何变成这样的。

看来我的理解根本就错了。任何人都可以给我一个解释或一个好的(希望不是那么深入......)资源来理解这个吗?

片断胜于文字:

int f(int i) {
  return i;
}

using f_ptr = int (*)(int);

f_ptr g(f_ptr fp) {
  return fp;
}

int main() {
  // This makes sense.
  f_ptr (*gp0)(f_ptr) = &g;

  // This is correct, although I don't get it...
  int (*(*gp1)(int (*)(int)))(int) = &g;

  // If you simply replace `f_ptr` by `int (*)(int)` as it's so defined with `using`,
  // I feel the type should become like this, which causes syntax error.
  // int (*)(int) (*gp2)(int (*)(int)) = &g;
}

C++ 这样做是为了与 C 兼容

C 这样做是为了让定义镜像使用

int f(int i) {
  return i;
}

using f_ptr = int (*)(int);

f_ptr g(f_ptr fp) {
  return fp;
}

int main() {
  // Definition
  int (*fp0)(int) = &f;
  // Use
  int m = (*fp0)(1);

  // Definition
  int (*(*gp1)(int (*)(int)))(int) = &g;
  // Use
  int i = (*(*gp1)(fp0))(1);
}

除了use中的*是可选的,所以大家都写

  int n = fp0(1);
  int j = gp1(fp0)(1);