存储函数指针的正确语法



令人惊讶的是,无论使用函数名称之前的什么符号,以下代码都可以很好地在gcc和clang中编译:*&或什么都没有。标准允许其中任何一个吗?存储函数指针的首选方法是什么?

#include <stdio.h>
typedef int foo(int a);
template <typename X>
int g(int y) {
return y * sizeof(X);
}
int main() {
foo* xxx;
// 1. what is correct according to standard?
// 2. why they all work?
xxx = *g<float>;
xxx = &g<float>;
xxx = g<float>;
printf("ok %dn", xxx(5));
}

所有这些都应该工作正常,并且在这里具有相同的效果。首选哪一个是样式问题,IMO 代码中的第一个令人困惑,另外两个是很常见的用法。

为方便起见,我将以与代码相反的顺序进行解释,

  1. 对于xxx = g<float>;,函数到指针的隐式转换是从g<float>开始执行的,转换后的指针被分配给xxx

  2. 对于xxx = &g<float>;operator&显式用于获取函数的地址,则返回的指针分配给xxx

  3. 对于xxx = *g<float>;,函数到指针的隐式转换是从g<float>执行的,然后指针被operator*取消引用,返回一个函数引用,在其上执行函数到指针的隐式转换(再次(,转换后的指针最后分配给xxx

相关内容

  • 没有找到相关文章

最新更新