変更の論理的根拠 (または以前の標準がどのようだったか) はわかりませんが、基本的にデフォルトの初期化は、ユーザー定義のコンストラクターを呼び出すか、何もしないかのいずれかです (ここで手を振っています: これは再帰的に行われます)。つまり、デフォルトのコンストラクターを持つサブオブジェクトは初期化され、ユーザー定義のコンストラクターを持たないサブオブジェクトは初期化されないままになります)。
これは、必要な言語の哲学に対する唯一の報酬の範囲内にあり、C 互換のすべての型で C と互換性があります。一方、value-initializationを要求できます。これは、それを持つオブジェクトのデフォルト コンストラクターを呼び出すか、初期化し0
て残りのサブオブジェクトの適切な型に変換することと同じです。
これは §8.5 初期化子 で説明されており、ナビゲートするのは簡単ではありません。zero-initialize、default-initialize、value-initializeの定義は 5 番目の段落です。
タイプ T のオブジェクトをゼロで初期化するとは、次のことを意味します。
— T がスカラー型 (3.9) の場合、オブジェクトは T に変換された値 0 (ゼロ) に設定されます。
— T が非共用体クラス型の場合、各非静的データ メンバーと各基本クラス サブオブジェクトはゼロ初期化されます。
— T が共用体型の場合、オブジェクトの最初の名前付きデータ メンバー89) はゼロで初期化されます。
— T が配列型の場合、各要素はゼロで初期化されます。
— T が参照型の場合、初期化は実行されません。
タイプ T のオブジェクトをデフォルトで初期化するとは、次のことを意味します。
— T が非 POD クラス型 (節 9) の場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません)。
— T が配列型の場合、各要素はデフォルトで初期化されます。
— それ以外の場合、オブジェクトはゼロで初期化されます。
タイプ T のオブジェクトを値で初期化するとは、次のことを意味します。
— T がユーザー宣言コンストラクター (12.1) を持つクラス型 (節 9) の場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません)。
— T が、ユーザーが宣言したコンストラクターを持たない非共用体クラス型である場合、T のすべての非静的データ メンバーと基底クラス コンポーネントは値で初期化されます。
— T が配列型の場合、各要素は値で初期化されます。
— それ以外の場合、オブジェクトはゼロで初期化されます
参照型のエンティティのデフォルトの初期化または値の初期化を呼び出すプログラムの形式が正しくありません。T が cv 修飾された型の場合、ゼロ初期化、デフォルト初期化、および値初期化のこれらの定義には、T の cv 修飾されていないバージョンが使用されます。