繁体   English   中英

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

[英]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对象上使用范围解析,而没有办法显式声明成员函数指针的范围。 我接受使用->*时应禁止使用语法,因为有时会以意想不到的方式重载运算符,但是我无法理解使用.*引用时阻止显式范围解析的原因。

我试图为指向基类的虚函数的成员指针禁用虚调度。

在本地块作用foo_member ,您声明的变量的名称为foo_member 不是名称Foo::foo_member ,即类Foo没有成员foo_member 相反,名称bar位于Foo类的范围内,也位于FooParent类的范围内。

因此,作用域解析机制按预期工作:解析作用域。

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

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

但是通话仍然最终被虚拟发送。 成员函数的虚拟性被烘焙到成员函数指针值中。 您可以做的下一件事是使用Lambda:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM