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

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

本文关键字:函数 地址 全局 为什么 运算符 成员 获取      更新时间:2023-10-16

以下代码运行良好的

#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的Lvalue可以隐式转换为T*[conv.func]/4.3),但对于成员函数没有类似的规则。

我不确定这背后的原因是什么,所以我想我的答案是"标准是这么说的"。也许是因为成员函数指针的使用频率不高,所以强制为它们提供额外的实现细节被认为是不必要的。