为什么不能将范围解析与成员指针取消引用一起使用?

Why can't one use scope resolution with member pointer dereference?

考虑一个简单的例子:

struct FooParent {
   virtual void bar() { }
};

struct Foo: FooParent {
   void bar() { }
};

int main() {
   Foo foo;
   void (Foo::*foo_member)() = &FooParent::bar;
   //(foo.*FooParent::foo_member)();
   foo.FooParent::bar();
}

如您所见,可以在调用 bar 成员函数时对 foo 对象使用范围解析,而无法显式声明成员函数指针的范围。我接受在使用 ->* 时应该禁止语法,因为运算符有时会以意想不到的方式重载,但我无法理解在使用 .*.[=14= 取消引用时阻止显式范围解析背后的原因]

我正在尝试为指向基础 class 的虚函数的成员指针禁用虚拟分派。

您在本地块范围内声明的变量名称是 foo_member不是一个名字Foo::foo_member,即classFoo没有成员foo_member。相比之下,名称 bar 位于 class Foo 的范围内,也位于 class FooParent.

的范围内

因此范围解析机制按预期工作:它解析范围。

[Update:] 没有通过成员函数指针禁用虚拟分派的机制。您可以像这样调用基础子对象的成员函数:

 void (FooParent::*p)() = &FooParent::bar;
 (static_cast<FooParent&>(foo).*p)();

但电话仍然以虚拟方式结束。成员函数的虚拟性被烘焙到成员函数指针值中。您可以做的下一个最好的事情是使用 lambda:

auto q = [](FooParent & f) { f.FooParent::bar(); };
q(foo);