澄清指向非静态类成员的指针

use*_*635 3 c++ pointers pointer-to-member language-lawyer

当我需要一个指向类成员的指针时,我会这样做

struct MyStruct
{
    int foo();
};

int (MyStruct::*p)() = &MyStruct::foo;
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我需要使用&运算符来获取可能被忽略的地址(如果它是静态函数).另外,我听说指向成员的指针实际上并不是指针,有人可以澄清一下吗?

R. *_*des 6

如果它是一个静态函数,它就像一个常规的非成员函数指针一样:函数名本身可以隐式转换为函数指针.

如果它是非静态成员函数,它不再是非成员函数:

  1. 它有一个隐藏的this参数;
  2. 在多继承方案中,将指针转换为其中一个基类可能会产生指向不同地址的指针.这意味着如果继承成员函数,则this可能需要在调用之前调整指针.这已经使得不可能使用指针来存储指向成员的指针函数.

Raymond Chen 用更多细节和例子写了一篇有趣的文章.