使用成员函数而不获取地址?

Using member function without taking address?

class C{
public:
  int i(){return 3;}
};

void memfn(int (C::* const & func)()){}
void fn(int (* const & func)()){}

int main() {
  fn(&foo); //Works
  fn(foo); //Works
  memfn(&C::i); //Works
  memfn(C::i); //Doesn't Work
}

将函数指针作为参数传递时,寻址运算符在函数上是可选的。为什么在成员函数上删除后它不起作用?

存在从全局函数引用或静态成员函数引用或 non-capturing lambda 到函数指针的隐式转换。这是为了 C 的能力。

但是这种隐式 reference-to-pointer 转换不适用于 non-static 成员函数(并捕获 lambda!),因为它们需要隐式传递的 this 指针才能工作,转换只是缺少那个东西。

对于您的情况,如果我们将 i() 设为静态,则可以通过引用或地址将其传递给 fn