【发布时间】: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) - 这也很好。
如果是这样,我觉得没有using 的f_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