最近我注意到成员函数在类中完全隐藏了具有相同名称的自由函数。我的意思是完全不考虑重载决议的每个具有相同名称的自由函数。我可以理解为什么它是这样完成的:
void f();
struct S
{
void f();
void g()
{
f(); // calls S::f instead of ::f
}
};
在函数具有相同签名的情况下,它唯一自然的变量作用域工作方式相同。但是为什么要禁止自由函数具有不同签名的明确调用,如下所示:
void f();
struct S
{
void f(int x);
void g()
{
f(); // fails to compile attempting to call S::f, which has wrong signature
}
};
我不是在问如何从类内部调用阴影自由函数。我想知道的是这个设计背后的基本原理。