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が配列型の場合、各要素は値で初期化されます。
- それ以外の場合、オブジェクトはゼロで初期化されます。