为什么不能将范围解析与成员指针取消引用一起使用?
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);
考虑一个简单的例子:
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);