C++ 为什么?;运算符用于获取成员函数的地址,但不用于全局函数?

C++ 为什么?;运算符用于获取成员函数的地址,但不用于全局函数?,c++,pointers,function-pointers,member-function-pointers,C++,Pointers,Function Pointers,Member Function Pointers,以下代码运行良好 #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; } #包括 使用名称空间std; 虚无乐趣() { cout函数

以下代码运行良好

#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;
}
#包括
使用名称空间std;
虚无乐趣()
{

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


我不确定这背后的原因是什么,所以我猜我的答案是“标准如此说”。可能是因为成员函数指针使用得不太频繁,因此为它们指定额外的实现细节被认为是不必要的。

从它复制与指向数据成员的指针的工作方式一致。将函数名隐式转换为函数指针类似于将数组名隐式转换为pointer(指向第一个元素)。这是从C继承来的一个特性。使指向成员的指针(无论函数与否)也能使用同样的功能,会弄乱允许派生类访问其基成员和命名空间成员的语法。
#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;
}