ホームページ  >  記事  >  バックエンド開発  >  C で中括弧を使用すると、プライベートのデフォルト コンストラクターを使用してクラスを初期化できるのはなぜですか?

C で中括弧を使用すると、プライベートのデフォルト コンストラクターを使用してクラスを初期化できるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-20 03:06:02125ブラウズ

Why Does Using Curly Braces Allow Initialization of a Class with a Private Default Constructor in C  ?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。