33

最近、std ::mapoperator[]関数に混乱しました。MSDNライブラリには、「引数のキー値が見つからない場合は、データ型のデフォルト値とともに挿入されます」と記載されています。私はこの問題の説明をもっと正確に検索しようとしました。たとえば、次のようになります 。std :: mapのデフォルト値 このページで、Michael Andersonは、「デフォルト値はデフォルトのコンストラクター(ゼロパラメーターコンストラクター)によって構築される」と述べています。

今、私の探求はこれに行き着きます:「ビルトインタイプのデフォルト値は何ですか?」。コンパイラ関連でしたか?または、c ++スターダード委員会によるこの問題の基準はありますか?

Visual Studio 2008で「int」タイプのテストを行ったところ、「int」タイプは値0で解釈されていることがわかりました。

4

4 に答える 4

30

はい、これは標準で定義されています。この場合、マップは「デフォルトの初期化」を実行しています。あなたが言うように、クラス型の場合、それは引数なしのコンストラクターを呼び出します。

組み込みタイプについては、'98標準で、セクション8.5「イニシエーター」を参照してください。

T型のオブジェクトをデフォルトで初期化するということは、次のことを意味します。

  • Tが非PODの場合..。
  • Tが配列型の場合..。
  • それ以外の場合、オブジェクトのストレージはゼロで初期化されます

そして、以前は、

タイプTのオブジェクトのストレージをゼロ初期化するということは、次のことを意味します。

  • Tがスカラー型の場合、ストレージはTに変換された値0(ゼロ)に設定されます

スカラータイプは次のとおりです。

  • 算術タイプ(整数、浮動小数点)
  • 列挙型
  • ポインタの種類
  • メンバータイプへのポインタ

特に、整数(ゼロに初期化された)で見られる動作は標準によって定義されており、信頼できます。

于 2010-12-24T03:47:00.650 に答える
22

C ++ 11標準では、std :: mapが組み込み型をゼロ初期化する必要があります(以前の標準と同様)が、理由はLukeHalliwellの回答とは少し異なります。特に、組み込みのデータ型を「デフォルトで初期化」することは、C ++ 11標準でゼロ初期化を意味するのではなく、「何もしない」ことを意味します実際に発生するstd::map::operator[]のは「値の初期化」です。

それにもかかわらず、新しい標準の最終結果は、ルークの答えと同じです。値はゼロで初期化されます。標準の関連部分は次のとおりです。

セクション23.4.4.3「マップ要素へのアクセス」は次のように述べています

T&operator [](const key_type&x);

効果:マップにxに相当するキーがない場合は、マップに挿入value_type(x, T())します。

..。

T()はセクション8.5で説明されています

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。

X a();

そして、この種の「値の初期化」は同じセクションで説明されています

タイプTのオブジェクトを値初期化するということは、次のことを意味します。

  • Tがユーザー提供のコンストラクター(12.1)を持つ(おそらくcv修飾された)クラスタイプ(条項9)の場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります) ;
  • Tがユーザー提供のコンストラクターのない(おそらくcv修飾された)非ユニオンクラスタイプである場合、オブジェクトはゼロで初期化され、Tの暗黙的に宣言されたデフォルトコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。
  • Tが配列型の場合、各要素は値で初期化されます。
  • それ以外の場合、オブジェクトはゼロで初期化されます。
于 2012-10-19T00:15:21.800 に答える
7

クラス型オブジェクトのデフォルト値は、クラスのデフォルトコンストラクターによって設定された値です。組み込み型の場合、デフォルト値は0です。

ただし、初期化されていない組み込み変数と、デフォルト値に初期化されている組み込み変数には違いがあることに注意してください。初期化されていないビルトインは、おそらくその時点でその変数のメモリアドレスにあった値を保持します。

int i;          // i has an arbitrary undefined value
int x = int();  // x is 0
于 2010-12-24T03:25:48.663 に答える
5
 |expression:   | POD type T                               | non-POD type T
 ==================================================================================================
 | new T         | not initialized                          | default-initialized
 | new T()       | always default-initialized               | always default-initialized
 | new T(x)      | always initialized via a constructor     | always initialized via a constructor

私の知る限り、stlはデフォルト値に新しいT()を使用するため、intが0の場合、デフォルトで初期化されます。

于 2010-12-24T03:33:04.640 に答える