gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:42:26 25 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();
}

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

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

最佳答案

您声明的变量的名称是 foo_member,位于本地 block 作用域内。它不是一个名称 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);

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

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