Предположим, что управление доступом предшествовало разрешению перегрузки. Фактически это будет означать, что public/protected/private
видимость будет контролироваться, а не доступность.
В разделе 2.10 « Проектирования и эволюции C ++» Страуструпа есть отрывок по этому поводу, в котором он обсуждает следующий пример.
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Страуструп упоминает о том , что польза от нынешних правил (видимость до того доступности) является то , что (временно) чейнинга на private
внутреннюю class X
в public
(например , для целей отладки) является то , что нет никаких изменений тихо в значении выше программы (т.е. X::a
предпринята попытка быть доступным в обоих случаях, что дает ошибку доступа в приведенном выше примере). Если public/protected/private
бы контролировать видимость, значение программы изменилось бы (global a
будет вызываться с помощью private
, иначеX::a
).
Затем он заявляет, что не помнит, было ли это явным дизайном или побочным эффектом технологии препроцессора, использованной для реализации C с предшественником Classess для Standard C ++.
Как это связано с вашим примером? В основном потому, что стандартное разрешение перегрузки соответствует общему правилу, согласно которому поиск имени выполняется перед контролем доступа.
10.2 Поиск имени члена [class.member.lookup]
1 Поиск имени члена определяет значение имени (id-выражения) в области класса (3.3.7). Поиск имени может привести к двусмысленности, и в этом случае программа имеет неправильный формат. Для id-выражения поиск имени начинается в области класса this; для квалифицированного идентификатора поиск имени начинается в области спецификатора вложенного имени. Поиск имени выполняется до управления доступом (3.4, раздел 11).
8 Если имя перегруженной функции обнаружено однозначно,
разрешение перегрузки (13.3) также выполняется до управления доступом . Неоднозначности часто можно разрешить, уточнив имя с именем класса.