以下是一个简单的例子,分别把成员函数指针的类型和函数指针的类型以及成员指针的类型做了一个比较。值得注意的是,由于普通的函数无法拷贝,在早期的语法中,并没有特意区分函数和函数指针,使得它们可以互相转换,但最好不要这么写。
#include#include struct foo { int a; int dummy(void) { return 1; } }; int dummy(void) { return 1; } foo f; int a = 1; int main() { using Int = int; using IntPtr = Int *; using FooIntPtr = Int foo::*; using _FooIntPtr = int(foo::*); std::cout << std::is_same_v << std::endl; // true std::cout << std::is_same_v << std::endl; // true std::cout << std::is_same_v << std::endl; // true using Fun = int(void); using FunPtr = Fun *; using FooFunPtr = Fun foo::*; using _FooFunPtr = int(foo::*)(); std::cout << std::is_same_v << std::endl; // true std::cout << std::is_same_v << std::endl; // true std::cout << std::is_same_v << std::endl; // true IntPtr ip = &a; FooIntPtr fip = &foo::a; FunPtr fp = &dummy; //FunPtr _fp = dummy; // it works, but it's wrong design inherited c, don't do that in cpp. FooFunPtr ffp = &foo::dummy; Int _a = *ip; Int _fa = f.*fip; Int __fa = (&f)->*fip; (*fp)(); //fp(); // it works, but it's wrong design inherited c, don't do that in cpp. (f.*ffp)(); ((&f)->*ffp)(); }



