プライベート コンストラクターがプライベート コンストラクターではない場合は何ですか?
C では、デフォルトのコンストラクターを private と宣言することが、プライベート コンストラクターを防ぐ簡単な方法のように思えるかもしれません。オブジェクトのインスタンス化。ただし、驚くべきことに、プライベートのデフォルト コンストラクターは依然として暗黙的に呼び出すことができます。
質問:
次のコードを考えてみましょう:
class C { C() = default; }; int main() { C c; // error: default constructor private auto c2 = C(); // error: default constructor private }
なぜコンストラクターはプライベートであるように見えますが、中括弧を使用して暗黙的に呼び出すことができます初期化?
答え:
鍵は C 14 仕様にあります。ユーザー提供のコンストラクターは、デフォルトまたは削除されずに明示的に宣言されたコンストラクターです。 C のデフォルト コンストラクターは最初の宣言で明示的にデフォルト設定されているため、ユーザー提供とみなされません。
その結果、C にはユーザー提供のコンストラクターが欠如し、集合体になります (8.5.1/1 によると)。仕様。集約は、プライベートまたは保護された非静的データ メンバー、基本クラス、仮想関数、およびユーザー提供のコンストラクターを持たないクラスとして定義されます。これは、デフォルトのコンストラクターが技術的にプライベートであるにもかかわらず、中括弧の初期化で C のオブジェクトを正常に作成できる理由を説明しています。
以上がC でプライベートのデフォルト コンストラクターを暗黙的に呼び出すことができるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。