我们知道要创建一个指向函数的“公共”指针,例如:
void fun();
void (*ptr)() = fun;
函数的名称也是函数启动的地址。所以我不需要使用地址运算符&像这样:
void (*ptr)() = &fun;
现在,对于指向成员函数的指针,我必须使用地址运算符。例如,对于具有指向成员函数ptr和函数fun()的类A,我必须写:
void(A::*ptr)() = &A::fun;
为什么会出现这种差异?
答案 0 :(得分:2)
根据C ++标准:
4.3函数到指针的转换 [conv.func]
函数类型
T
的左值可以转换为类型的prvalue “指向T
”的指针。结果是指向函数的指针。此转换从不适用于非静态成员函数,因为 一个引用非静态成员函数的左值不能 获得。
答案 1 :(得分:0)
我认为差异是因为A::fun
是类A
的非静态成员。我的意思是,如果你的fun()
是A
的静态成员,那么它就像普通函数一样。试试吧。
答案 2 :(得分:0)
因为现在该功能是在类中定义的。指向成员函数的指针保存函数在类布局中的“相对地址”,因此您必须以这种方式访问它。
如果是静态的,它没有这个指针,它的行为就像一个全局函数,因此,你可以像普通函数指针一样访问它。