C++ 作为没有显式对象的指针的成员进行ban调用的原因是什么(即使在非静态成员函数中也是如此)?

C++ 作为没有显式对象的指针的成员进行ban调用的原因是什么(即使在非静态成员函数中也是如此)?,c++,pointer-to-member,C++,Pointer To Member,考虑以下代码段: struct C { void (C::*m)(); void f(); void g(); ... }; 如果我们想通过从另一个成员函数指向成员的指针调用成员函数,我们需要显式使用this关键字: void C::f() { m = &C::g; g(); // works well w/o explicit `this` this->g(); // also works good (this->

考虑以下代码段:

struct C
{
   void (C::*m)();
   void f();
   void g(); 
   ...
};
如果我们想通过从另一个成员函数指向成员的指针调用成员函数,我们需要显式使用
this
关键字:

void C::f()
{ 
    m = &C::g;
    g(); // works well w/o explicit `this`
    this->g(); // also works good
    (this->*m)(); // ok
    m(); // not allowed w/o object... why?
}
在最后一行,我有一个错误:
错误:必须使用“*”或“->*”调用“((C*)this)->C::m(…)”中成员函数的指针,例如“(…->*((C*)this)->C::m)(…)”


为什么(禁止的原因是什么)不允许通过指向另一个成员函数的成员的指针调用成员函数,而该成员函数没有显式对象(并且必须仅使用二进制运算符“.”或“->”)

成员函数是某个对象的成员。指向成员函数的指针只是一个指针,不需要任何对象实例的任何信息。@JoachimPileborg我想你没有抓住要点
g()
是一个成员函数,但它可以在不显式写入
this->g()
的情况下调用,因此OP想知道为什么隐式
this->
也不能用于成员函数指针
m
。@alexolute可能没有理由,它就是这样。成员函数指针实际上并不经常使用,因此标准可能不会通过处理这种情况而增加更多的措辞和复杂性。普通成员函数调用的发生频率更高,因此更方便地支持它们。@DanielFrey因为
g
是一个成员函数,
this->
部分是隐式的,编译器会自动添加它。因为
m
是一个指向成员函数的指针,编译器如何知道它应该使用
this
而不是其他对象实例呢?@JoachimPileborg和
m
也是一个成员。我认为使用隐式
this->
技术上不会有问题,更重要的是决定不这样做。无论如何,那些“为什么标准”的问题通常不能以明确的方式回答。