[英]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
。 我认为这可能是一个很大的陷阱。
我只是好奇:
为什么成员函数的重载解析会排除全局函数?
有什么根据?
这就是过载解析的工作方式, 这很好 。
想象一下,您确实有一个很大的项目,大量的相互依赖关系,第三方代码和跨模块的内容。 在这个巨大的混乱中,您只有一个知道的课程。 它已经完美运行了5年,高效,易于阅读和清洁。 您不想碰它。 然后,您升级模块,并开始出现编译器错误。 不好了! 该模块(您无法控制DoAmazingStuff()
在全局名称空间中引入了新函数DoAmazingStuff()
。 与我们类中的方法名称相同。 您将不得不对其进行重构,因为现在您不能再为类成员使用相同的名称。 mm!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.