C の "プライベート" コンストラクターがパブリックになるとき
C では、型の既定のコンストラクターをプライベートとして宣言すると、通常、そのアクセシビリティが制限されます。ただし、特定のシナリオでは、この制限が予期せずバイパスされる可能性があります。
次の例を考えてみましょう:
この場合、プライベート コンストラクターが原因で、C のインスタンスを作成しようとする両方の試行が失敗します。 。驚くべきことに、中括弧を使用して C を直接初期化すると、この制限は解除されるようです。
トリックの公開
この奇妙な動作は、C 14 の集合体の初期化に起因します。ルール。 [dcl.fct.def.default] の 8.4.2/5 に従って、最初の宣言で明示的にデフォルト設定されている場合、デフォルト コンストラクターは「ユーザー提供」とみなされません。 C のデフォルトのコンストラクターはこの基準に適合するため、ユーザー提供として扱われません。
その結果、C は [dcl.init.aggr] の 8.5.1/1 による集約の定義を満たします。ユーザー提供のコンストラクター、プライベートまたは保護された非静的データ メンバー、基本クラス、または仮想function.
集合体の初期化
集合体は、簡素化された初期化ルールを持つ特殊な型です。このコンテキストにおける中括弧は集約初期化を意味し、プライベート コンストラクターを使用した場合でもオブジェクトの作成を許可します。この例の場合、コンパイラは {} を初期化リストとして扱い、プライベート コンストラクターの制限をバイパスし、C を集合体として初期化します。
以上がC で中括弧を使用すると、プライベートのデフォルト コンストラクターを使用してクラスを初期化できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。