過負荷を解決する前にアクセス制御が行われたとします。事実上、これはpublic/protected/private
アクセシビリティではなく制御された可視性を意味します。
StroustrupによるC ++の設計と進化のセクション2.10は、これについての節があり、そこで次の例について説明しています。
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrupは、現在のルール(アクセシビリティの前の可視性)の利点は、(一時的に)private
内部class X
をpublic
(たとえば、デバッグの目的で)変更することは、上記のプログラムの意味に静かな変更がない(つまりX::a
、どちらの場合もアクセスされるため、上記の例ではアクセスエラーが発生します)。public/protected/private
可視性を制御する場合、プログラムの意味が変わります(グローバルa
はで呼び出されprivate
、それ以外の場合はX::a
)。
その後、彼は、それが明示的な設計によるものか、標準C ++の前身であるClassessでCを実装するために使用されるプリプロセッサテクノロジーの副作用によるものかを思い出さないと述べています。
これはあなたの例とどのように関連していますか?基本的に、標準はオーバーロードの解決を行ったため、名前の検索はアクセス制御の前に行われるという一般的なルールに準拠しています。
10.2メンバー名のルックアップ[class.member.lookup]
1メンバー名ルックアップは、クラススコープ(3.3.7)内の名前(id-expression)の意味を決定します。名前の検索により、あいまいさが生じる可能性があり、その場合、プログラムの形式が正しくありません。id-expressionの場合、名前の検索はthisのクラススコープで始まります。修飾IDの場合、名前の検索は、nestedname-指定子のスコープから始まります。名前の検索は、アクセス制御の前に行われます(3.4、条項11)。
8オーバーロードされた関数の名前が明確に見つかると、アクセス制御の前に
オーバーロードの解決(13.3)も行われます。あいまいさは、名前をクラス名で修飾することによって解決できることがよくあります。