Suponha que o controle de acesso venha antes da resolução de sobrecarga. Efetivamente, isso significaria public/protected/private
visibilidade controlada em vez de acessibilidade.
A Seção 2.10 de Design e Evolução de C ++ por Stroustrup tem uma passagem onde ele discute o seguinte exemplo
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrup menciona que um benefício das regras atuais (visibilidade antes da acessibilidade) é que (temporariamente) private
entrar class X
no interior public
(por exemplo, para fins de depuração) é que não há nenhuma mudança silenciosa no significado do programa acima (ou seja, X::a
é tentado ser acessado em ambos os casos, o que dá um erro de acesso no exemplo acima). Se public/protected/private
controlasse a visibilidade, o significado do programa mudaria (global a
seria chamado com private
, caso contrário X::a
).
Ele então afirma que não se lembra se foi por design explícito ou um efeito colateral da tecnologia de pré-processador usada para implementar o C com o predecessor Classess para C ++ Padrão.
Como isso está relacionado ao seu exemplo? Basicamente porque o padrão fez a resolução de sobrecarga estar em conformidade com a regra geral de que a pesquisa de nomes vem antes do controle de acesso.
10.2 Consulta de nome de membro [class.member.lookup]
1 A pesquisa de nome de membro determina o significado de um nome (expressão de id) em um escopo de classe (3.3.7). A pesquisa de nome pode resultar em ambigüidade e, nesse caso, o programa está malformado. Para uma expressão de id, a pesquisa de nome começa no escopo de classe deste; para um id qualificado, a pesquisa de nome começa no escopo do especificador de nestedname. A pesquisa de nome ocorre antes do controle de acesso (3.4, Cláusula 11).
8 Se o nome de uma função sobrecarregada for encontrado sem ambigüidade, a
resolução de sobrecarga (13.3) também ocorre antes do controle de acesso . As ambigüidades geralmente podem ser resolvidas qualificando um nome com seu nome de classe.