令人惊讶的是,无论使用函数名称之前的什么符号,以下代码都可以很好地在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 代码中的第一个令人困惑,另外两个是很常见的用法。
为方便起见,我将以与代码相反的顺序进行解释,
-
对于
xxx = g<float>;
,函数到指针的隐式转换是从g<float>
开始执行的,转换后的指针被分配给xxx
。 -
对于
xxx = &g<float>;
,operator&
显式用于获取函数的地址,则返回的指针分配给xxx
。 -
对于
xxx = *g<float>;
,函数到指针的隐式转换是从g<float>
执行的,然后指针被operator*
取消引用,返回一个函数引用,在其上执行函数到指针的隐式转换(再次(,转换后的指针最后分配给xxx
。