デフォルト コンストラクターのプライベート シャドウ
デフォルト コンストラクターをプライベートにする目的で型を宣言する場合、default キーワードを使用すると、次のコードに示すように、望ましい結果が得られます。スニペット:
class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // error: as above }
驚くべきことに、このコードはコンストラクターを明示的にプライベートにしているにもかかわらず、エラーを生成します。ただし、次のコードは正常にコンパイルされます。
class C { C() = default; }; int main() { C c{}; // OK on all compilers auto c2 = C{}; // OK on all compilers }
中括弧を使用するとコンストラクターの動作が異なるのはなぜですか?
C 14 Default Constructor Defaultness
鍵は C 14 標準 (8.4.2/5) にあります[dcl.fct.def.default])、「ユーザー提供」関数を「ユーザーが宣言し、最初の宣言で明示的にデフォルト設定または削除されていない」関数として定義します。これは、この例のデフォルト コンストラクターが明示的にデフォルト設定されているため、ユーザー提供とみなされないことを意味します。
Aggregate Constructor Illumination
その結果、クラス C は次のようになります。ユーザーが提供するコンストラクターはありません。したがって、これは 8.5.1/1 [dcl.init.aggr] に従って集合体として分類され、集合体は「ユーザー提供のコンストラクター、プライベートまたは保護された非静的要素を持たない配列またはクラス」であると規定されています。データ メンバー、基本クラス、仮想関数はありません。"
を使用した集約構築中かっこ
集約には、プライベート コンストラクターがある場合でも中かっこ {} を使用して構築できる特別な構築ルールがあります。このルールは、通常は複数のメンバーを含む、配列や構造体などの集合体の初期化を簡素化することを目的としています。
したがって、クラス C のコンストラクターは、プライベートとしてマークされていても、中かっこ内で使用できます。クラス自体は集合体とみなされます。
以上がC のプライベート デフォルト コンストラクターは、中括弧と一緒に使用すると機能するのに、括弧を使用すると失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。