C 11 メンバー初期化子を使用したクラスの集合体初期化
C 11 では、クラスに中括弧を使用した集合体初期化が導入され、初期化子を指定できるようになりました。すべての非静的データ メンバー。ただし、C 11 の標準では、クラス内メンバー初期化子は集合体構造内に存在できますか?
C 11 では、クラス内にメンバー初期化子があると、構造体またはクラスが非集合体になります。この制限は、クラス内メンバーの初期化子がユーザー定義のコンストラクターと類似点を共有しているという考えに由来しています。ただし、メンバー初期化子を追加しても、自動的にクラスが集合体としての資格を剥奪されるべきではありません。
C 14 標準ではこの問題に対処し、ユーザー提供のコンストラクター (プライベートまたは保護された非静的コンストラクター) のみを除外するように集合体クラスの定義を変更しています。データ メンバー、基本クラス、仮想関数。不適格子としてのメンバー初期化子の包含は削除されました。
したがって、C 14 では、次のようなクラスは集約とみなされます:
struct A { int a = 3; int b = 3; }; A a{0, 1};
C 11 では、上記はA は集計ではないため、コードは無効になります。ただし、C 14 では、コードは有効であり、オブジェクト a は a = 0 および b = 1 で初期化されます。
g の最近のバージョン (5.0 以降) は、C 14 の集計定義をサポートするようになりました。非静的メンバー初期化子。したがって、サンプル コードは -std=c 14 または -std=c 1y を使用して g でコンパイルされます。
以上がC 14 では、メンバー初期化子を持つクラスを集合体にすることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。