繁体   English   中英

为什么成员函数的重载解析会排除全局函数?

[英]Why does the overload resolution of member functions exclude the global functions?

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 我认为这可能是一个很大的陷阱。

我只是好奇:

为什么成员函数的重载解析会排除全局函数?

有什么根据?

作为B类的设计师,我可能不知道B的基类

我不同意

为什么成员函数的重载解析会排除全局函数?

因为这两个重载属于两个不同的作用域,所以编译器选择相同作用域的重载。 阅读第3.4.1节。 所述f的内(相同)范围隐藏外部的f

有什么根据?

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

在一个打电话给亚历克斯的家庭中,他们希望自己的小男孩亚历克斯进来,而不是马其顿亚历山大三世

这就是过载解析的工作方式, 这很好

想象一下,您确实有一个很大的项目,大量的相互依赖关系,第三方代码和跨模块的内容。 在这个巨大的混乱中,您只有一个知道的课程。 它已经完美运行了5年,高效,易于阅读和清洁。 您不想碰它。 然后,您升级模块,并开始出现编译器错误。 不好了! 该模块(您无法控制DoAmazingStuff()在全局名称空间中引入了新函数DoAmazingStuff() 与我们类中的方法名称相同。 您将不得不对其进行重构,因为现在您不能再为类成员使用相同的名称。 mm!

暂无
暂无

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

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