gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:43:25 26 4
gpt4 key购买 nike

考虑一个简单的例子:

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();
}

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

我正在尝试禁用指向基类虚拟函数的成员指针的虚拟调度。

最佳答案

您声明的变量名称是 foo_member , 在您的本地块范围内。不是名字Foo::foo_member ,即类 Foo没有成员(member) foo_member .相比之下,名称 bar生活在类的范围内 Foo ,并且也在类 FooParent 的范围内.

所以作用域解析机制按预期工作:它解析作用域。

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

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

但电话最终还是以虚拟方式发送。成员函数的虚拟性被烘焙到成员函数指针值中。您可以做的下一个最好的事情是使用 lambda:
auto q = [](FooParent & f) { f.FooParent::bar(); };
q(foo);

关于c++ - 为什么不能将范围解析与成员指针取消引用一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69214103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com