gpt4 book ai didi

c++ - 为什么成员函数的重载决议不包括全局函数?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:51 25 4
gpt4 key购买 nike

void f()
{}

struct A
{
void f()
{}
};

struct B : A
{
B()
{
f(); // A::f() is always called, and ::f is always ignored
}
};

int main()
{
B();
}

作为 B 类的设计者,我可能不知道 B 的基类,即 A,有一个成员函数A::f,我只知道::f,调用::f正是我想要的。

我期望的是编译器由于调用 f 的歧义而给出错误。但是,编译器总是选择 A::f 而忽略 ::f。我认为这可能是一个很大的陷阱。

我只是想知道:

为什么成员函数的重载决议不包括全局函数?

理由是什么?

最佳答案

As the class B's designer, I MIGHT NOT know B's base class

我不同意。

Why does the overload resolution of member functions exclude the global functions?

因为这两个重载属于两个不同的作用域,编译器选择相同作用域的重载。阅读§3.4.1。内部(相同)作用域的 f 隐藏了外部的 f

What's the rationale?

要有坚实的规则。我们更喜欢在相同的范围内工作。除非我们明确想从其他地方调用一个对象。

在一个调用 Alex 的家庭中,他们希望他们的小男孩 Alex 进来,而不是 Alexander III of Macedon .

关于c++ - 为什么成员函数的重载决议不包括全局函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19604660/

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