Недавно я обратил внимание , что функции-члены полностью затеняютбесплатные функции с тем же именем внутри класса. И под полностью я подразумеваю, что каждая свободная функция с тем же именем вообще не рассматривается для разрешения перегрузки. Я могу понять, почему это делается с чем-то вроде этого:
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
}
};
Я не спрашиваю, как вызвать затененную свободную функцию изнутри класса. Что я хочу знать, так это обоснование этого дизайна.