Почему функции-члены класса затеняют свободные функции с тем же именем?

Недавно я обратил внимание , что функции-члены полностью затеняютбесплатные функции с тем же именем внутри класса. И под полностью я подразумеваю, что каждая свободная функция с тем же именем вообще не рассматривается для разрешения перегрузки. Я могу понять, почему это делается с чем-то вроде этого:

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
    }
};

Я не спрашиваю, как вызвать затененную свободную функцию изнутри класса. Что я хочу знать, так это обоснование этого дизайна.

10
задан yuri kilochek 11 October 2019 в 13:01
поделиться