8

新しいオブジェクトを作成すると、常にオブジェクトの既定のコンストラクターが呼び出され、コンストラクターが明示的であるか、コンパイラによって自動的に生成されるかは関係ないと常に考えていました。別の質問に対するこの高く評価されている回答によると、これは C++98 と C++03 の間で微妙な方法で変更され、現在は次のように機能します。

struct B { ~B(); int m; }; // non-POD, compiler generated default ctor 
new B;   // default-initializes (leaves B::m uninitialized)
new B(); // value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.

誰でも教えてもらえますか:

  1. なぜ標準が変更されたのか、つまり、これによりどのような利点が得られるのか、以前にはなかったことが可能になったのか。
  2. 「デフォルト初期化」と「値初期化」という用語は正確には何を表していますか?
  3. 規格の関連部分は何ですか?
4

1 に答える 1

3

変更の論理的根拠 (または以前の標準がどのようだったか) はわかりませんが、基本的にデフォルトの初期化は、ユーザー定義のコンストラクターを呼び出すか、何もしないかのいずれかです (ここで手を振っています: これは再帰的に行われます)。つまり、デフォルトのコンストラクターを持つサブオブジェクトは初期化され、ユーザー定義のコンストラクターを持たないサブオブジェクトは初期化されないままになります)。

これは、必要な言語の哲学に対する唯一の報酬の範囲内にあり、C 互換のすべての型で C と互換性があります。一方、value-initializationを要求できます。これは、それを持つオブジェクトのデフォルト コンストラクターを呼び出すか、初期化し0て残りのサブオブジェクトの適切な型に変換することと同じです。

これは §8.5 初期化子 で説明されており、ナビゲートするのは簡単ではありません。zero-initializedefault-initializevalue-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 修飾されていないバージョンが使用されます。

于 2011-08-16T21:26:53.017 に答える