为什么获取成员函数的地址需要 & 运算符而不是全局函数?

Why & operator is needed for taking address of member functions but not for global functions?

以下代码运行良好

#include <iostream>
using namespace std;

void fun()
{
    cout<<"having some fun";
}

typedef void (*funptr)();
int main() {
    // your code goes here

    funptr p=fun;

    p();
    return 0;
}

这个不行。

#include <iostream>
using namespace std;

class myclass
{
    public:
    void fun()
    {
        cout<<endl<<"having fun inside myclass"<<endl;
    }
};

typedef void (myclass::*funptr)();

int main() {
    // your code goes here

    funptr p=myclass::fun; //THIS DOESN'T WORK. WHY?

    myclass m;

    (m.*p)();
    return 0;
}

为什么成员函数需要 & 运算符?

函数类型 T 的左值可以隐式转换为 T* ([conv.func]/4.3),但成员函数没有类似的规则。

我不确定这背后的原因是什么,所以我想我的答案是 "the standard says so"。可能是因为成员函数指针不经常使用,因此认为没有必要为它们强制执行额外的实现细节。