为什么类成员函数具有相同名称的阴影自由函数?

yur*_*hek 10 c++ overloading member-functions name-lookup name-hiding

最近我注意到,当在类中时,成员函数完全使用相同名称的阴影函数.完全我的意思是,每个具有相同名称的自由函数根本不考虑重载解析.我能理解为什么用这样的事情来完成它:

void f();

struct S
{
    void f();

    void g()
    {
        f(); // calls S::f instead of ::f
    }
};
Run Code Online (Sandbox Code Playgroud)

在函数具有相同签名的情况下,其唯一自然的变量作用域以相同的方式工作.但是为什么要禁止自由函数具有不同签名的无意义调用:

void f();

struct S
{
    void f(int x);

    void g()
    {
        f(); // fails to compile attempting to call S::f, which has wrong signature
    }
};
Run Code Online (Sandbox Code Playgroud)

我不是问如何从类中调用一个带阴影的自由函数.我想知道的是这种设计背后的基本原理.

Xeo*_*Xeo 7

对于非限定名称查找,一次只考虑一个范围,如果该范围内的搜索未产生任何结果,则搜索下一个更高范围.在您的情况下,只S搜索范围.

但是为什么要禁止自由函数具有不同签名的无意义调用:

问题是名称查找不涉及除名称,标识符之外的任何内容.你完全忘记了你想要调用一个函数,它只是看到一个标识符.如果你只是使用相同的名字查找auto x = f;,如果你这样想,有很好的理由你只想要一个非常有限的搜索范围.任何其他东西都会让用户感到惊讶.