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

C++ 为什么成员函数的重载解析排除了全局函数?,c++,function,namespaces,overloading,overload-resolution,C++,Function,Namespaces,Overloading,Overload Resolution,作为类B的设计者,我可能不知道B的基类,即A,有一个成员函数A::f,我只知道::f,调用::f正是我想要的 我所期望的是,由于调用f的模糊性,编译器会给出一个错误。但是,编译器总是选择A::f并忽略::f。我认为这可能是一个很大的陷阱 我只是想知道: 为什么成员函数的重载解析排除了全局函数? 理由是什么? 作为B类的设计者,我可能不知道B的基类 我不同意 为什么成员函数的重载解析会排除 全球功能 因为这两个重载属于两个不同的作用域,并且编译器选择相同作用域的重载。阅读§3.4.1。内部(相同)

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

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

我只是想知道:

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

理由是什么?

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

我不同意

为什么成员函数的重载解析会排除 全球功能

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

理由是什么

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

在一个打电话给亚历克斯的家庭里,他们希望他们的小儿子亚历克斯进来,而不是警察

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

我不同意

为什么成员函数的重载解析会排除 全球功能

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

理由是什么

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


在一个打电话给Alex的家庭里,他们希望他们的小儿子Alex进来,而不是那个。

这就是超负荷解决的工作原理,这很好


想象一下,你真的有一个大项目,大量的相互依赖关系,第三方代码和跨模块包含。在这片混乱中,你知道有一个类是有效的。它已经完美地工作了5年,它的效率,易于阅读和清洁。你不想碰它。然后升级模块,并开始出现编译器错误。哦,不!该模块(您无法控制)在全局命名空间中引入了一个新函数
doamazingstaff()
。与我们类中的方法名相同。您将不得不重构它,因为现在您不能再为类成员使用相同的名称。真倒霉

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

想象一下,你真的有一个大项目,大量的相互依赖关系,第三方代码和跨模块包含。在这片混乱中,你知道有一个类是有效的。它已经完美地工作了5年,它的效率,易于阅读和清洁。你不想碰它。然后升级模块,并开始出现编译器错误。哦,不!该模块(您无法控制)在全局命名空间中引入了一个新函数
doamazingstaff()
。与我们类中的方法名相同。您将不得不重构它,因为现在您不能再为类成员使用相同的名称。真倒霉

void f()
{}

struct A
{
    void f()
    {}
};

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

int main()
{
    B();
}