为什么获取成员函数的地址需要 & 运算符而不是全局函数?
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"。可能是因为成员函数指针不经常使用,因此认为没有必要为它们强制执行额外的实现细节。
以下代码运行良好
#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"。可能是因为成员函数指针不经常使用,因此认为没有必要为它们强制执行额外的实现细节。