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