私が標準を解釈する方法では、サンプル コードは整形式です。(そして、そうです、friend
宣言は@Steve Townsendが引用したものとは大きな違いがあります。)
private
11.2p1: クラスがアクセス指定子を使用して別のクラスの基本クラスとして宣言されている場合、基本クラスのメンバーpublic
と派生クラスのメンバーprotected
としてアクセスできます。private
11.2p4:クラスNで名前が付けられている場合、メンバーmにアクセスできます。
- Nのメンバーとしてのmが public である、または
- Nのメンバーとしてのmがプライベートであり、参照がクラスNのメンバーまたはフレンドで発生する、または
- Nのメンバーとしてのmは保護されており、参照はクラスNのメンバーまたはフレンド、またはNから派生したクラスPのメンバーまたはフレンドで発生します。ここで、 Pのメンバーとしてのmは非公開または保護されています。
- 参照点でアクセス可能なNの基本クラスBが存在し、クラスBで名前が付けられたときにmにアクセスできます。
11.4p1: クラスのフレンドは、クラスのメンバーではないが、クラスのプライベートおよび保護されたメンバー名の使用が許可されている関数またはクラスです。
第 11 条 (メンバーのアクセス制御) には、あるクラスのフレンドが、そのクラスとフレンドになったクラスよりもアクセス許可が少ないことを意味する記述はありません。「アクセス可能」は、特定のクラスのコンテキストでのみ定義されることに注意してください。一般に、メンバーまたは基底クラスが「アクセス可能」または「アクセス不可」であると話すことがありますが、「すべてのコンテキストでアクセス可能」または「すべてのクラスでアクセス可能」であるかについて話す方が正確です (この場合のように)。のみpublic
が使用される場合)。
次に、自動定義メソッドでのアクセス制御のチェックについて説明する部分です。
12.1p7: クラスの暗黙的に宣言されたデフォルト コンストラクターは、そのクラス型 (1.8) のオブジェクトを作成するために使用されるときに暗黙的に定義されます。暗黙的に定義された既定のコンストラクターは、空の mem-initializer-list (12.6.2) と空の関数本体を使用して、そのクラスのユーザー作成の既定のコンストラクターによって実行されるクラスの初期化のセットを実行します。そのユーザー作成のデフォルト コンストラクターの形式が正しくない場合、プログラムは形式が正しくありません。
12.6.2p6: 仮想基本クラスを表すすべてのサブオブジェクトは、最も派生したクラス (1.8) のコンストラクターによって初期化されます。最も派生したクラスのコンストラクターが仮想基本クラスのmem-initializerを指定しない場合、仮想基本クラス サブオブジェクトを初期化するために の既定のコンストラクターが呼び出されますV
。アクセス可能な既定のコンストラクターがないV
場合、初期化の形式が正しくありません。V
12.4p5: 暗黙的に宣言されたデストラクタは、そのクラス型 (3.7) のオブジェクトを破棄するために使用されるときに暗黙的に定義されます。デストラクタが暗黙的に定義されているクラスに次のものがある場合、プログラムは不正な形式です。
- アクセスできないデストラクタを持つクラス型 (またはその配列) の非静的データ メンバー、または
- アクセスできないデストラクタを持つ基本クラス。
12.8p7: 暗黙的に宣言されたコピー コンストラクターは、そのクラス型またはそのクラス型から派生したクラス型のオブジェクトのコピーからそのクラス型のオブジェクトを初期化するために使用される場合、暗黙的に定義されます。[注: コピー コンストラクターは、実装でその使用が省略されていても暗黙的に定義されます (12.2)。
- アクセスできないかあいまいなコピー コンストラクターを持つクラス型 (またはその配列) の非静的データ メンバー、または
- アクセスできないかあいまいなコピー コンストラクターを持つ基本クラス。
12.8p12: コピー代入演算子が暗黙的に定義されているクラスに次のものがある場合、プログラムは不正な形式です。
- 型の非静的データ メンバー
const
、または
- 参照型の非静的データ メンバー、または
- アクセスできないコピー代入演算子を持つクラス型 (またはその配列) の非静的データ メンバー、または
- アクセスできないコピー代入演算子を持つ基本クラス。
「アクセス不可」または「アクセス可能」に言及するこれらすべての要件は、何らかのクラスのコンテキストで解釈する必要があり、意味のある唯一のクラスは、メンバー関数が暗黙的に定義されているクラスです。
元の例では、デフォルトのコンストラクタ、デストラクタ、コピー コンストラクタ、およびコピー代入演算子class A
が暗黙的に含まれています。public
11.2p4 では、class C
は のフレンドであるためclass A
、クラス で名前を付けると、これらすべてのメンバーにアクセスできますC
。したがって、 のこれらのメンバーに対するアクセス チェックによって、の既定のコンストラクタ、デストラクタ、コピー コンストラクタ、またはコピー代入演算子class A
の暗黙的な定義が不適切な形式になることはありません。class C