为什么获取成员函数指针值甚至需要从类内部进行类名限定?

Jon*_*Mee 11 c++ methods member-function-pointers function-pointers dereference

当一个成员函数指针返回到该类的一个成员函数中的一个类时,我仍然需要指定该类.我不能简单地拿地址.例如,此代码工作正常:

class Foo {
public:
    void func(int param) { cout << param << endl; }
    void (Foo::*getPointer())(int) { return &Foo::func; }
};
Run Code Online (Sandbox Code Playgroud)

但如果在getPointer我尝试简单地做:return &func我得到这个错误:

prog.cpp:在成员函数' void (Foo::* Foo::getPointer())(int)':
prog.cpp:8:43:错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说' &Foo::func'[-fpermissive]
void (Foo::*getPointer())(int) { return &func; }

为什么我必须在我所在的上下文中指定类?

Sha*_*our 4

指针和指向成员的指针是不同的类型,我们可以从 C++ 标准草案部分3.9.2[basic.compound] 中看到,其中包括指针的复合类型以及指向非静态类成员的指针,并注释:

静态类成员是对象或函数,指向它们的指针是普通的对象或函数指针

我认为这个问题在《带注释的 C++ 参考手册》( ARM )Johannes 的回答中得到了很好的描述:

请注意,必须显式使用取址运算符来获取指向成员的指针;没有隐式转换...如果有的话,我们在成员函数的上下文中就会产生歧义...例如,

void B::f() {
    int B::* p = &B::i;   // ok
    p = B::i;         // error: B::i is an int
    p = &i;           // error: '&i'means '&this->i'
                      // which is an 'int*'

    int *q = &i;      // ok
    q = B::i;         // error: 'B::i is an int
    q = &B::i;        // error: '&B::i' is an 'int B::*'
}
Run Code Online (Sandbox Code Playgroud)

特别是这些行:

int B::* p = &B::i; // OK
Run Code Online (Sandbox Code Playgroud)

和:

p = &i; // error: '&i'means '&this->i' which is an 'int*'
Run Code Online (Sandbox Code Playgroud)

展示合格名称和不合格名称之间的区别。