web-dev-qa-db-ja.com

std :: map組み込み型のデフォルト値

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

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

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

29
WKPlus

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

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

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

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

そして、以前は、

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

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

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

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

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

26
Luke Halliwell

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

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

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

T&演算子[](const key_type&x);

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

.。

T()については、セクション8.5で説明しています。

初期化子が空の括弧のセットであるオブジェクト、つまり()は、value-initializedでなければなりません。

X a();

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

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

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

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

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

int i;          // i has an arbitrary undefined value
int x = int();  // x is 0
8
wilhelmtell
 |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はデフォルト値にnew T()を使用するため、intが0の場合、デフォルトで初期化されます。

5
j_kubik