【问题标题】:Type of function pointer that receives and returns function pointer?接收和返回函数指针的函数指针类型?
【发布时间】:2020-06-24 10:25:22
【问题描述】:

指向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)),因为,当你简单地将f_ptr 替换为int (*)(int) 时,你会得到这个,因为它是用using 定义的,但是这个实际上只是导致语法错误。实际的类型是int (*(*[variable comes here])(int (*)(int)))(int),但我不明白它是怎么变成这样的。

看来我的理解从根本上是错误的。谁能给我一个解释或一个好的(希望不是那么深入......)资源来理解这一点?

sn-p 可能比文字更好:

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;
}

【问题讨论】:

  • 您的版本无法正常工作,原因与您不能将函数指针声明为 int (*)(int) ptr; 相同。
  • 旁注:第三版auto gp2 = &g;
  • "但这实际上只是导致语法错误。" 什么错误?请edit完整引用。结果可能是说明性的。
  • @mch 谢谢。我知道汽车,但我想了解 c[++] 类型的工作原理......
  • 顺便说一句。如果你害怕嵌套函数指针类型,typedefs 或usings 没有错。读者将对此表示感谢。

标签: c++ pointers function-pointers


【解决方案1】:

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);
}

除了使用中的*s是可选的,所以大家写

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

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2013-04-10
    • 2021-05-30
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多