2012-01-20 24 views
6

std::unordered_map using operator []の要素に初めてアクセスすると自動的に作成されます。初期化についての保証は何か(もしあれば)? (初期化された値であることが保証されているか、または構築された場合のみ保証されますか?std :: unordered_mapの初期化

例:

std::unordered_map<void *, size_t> size; 
char *test = new char[10]; 
size[test] += 10; 

ですこのシーケンスの終わりに10であることが保証サイズ[テスト]?

答えて

16

サイズ[テスト]はこのシーケンスの最後に10であることが保証されていますか?

はい。コードの最後の行に 、size[test]T()に要素値は、初期化、またはsize_t()この場合:

C++ 11 23.4.4.3マップ要素アクセス[map.access]

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

1効果:マップにxと等しいキーがない場合は、value_type(x、T())をマップに挿入します。 T()のよう

、正確な言語は、やや複雑であるので、私は、関連するビットを引用してみましょう:次のように初期化子の

C++ 11の8.5.16意味があります。

- 初期化子が()の場合、オブジェクトは値で初期化されます。タイプTの


8.5.7値初期化へのオブジェクトの意味:

を - Tは、(おそらくCV修飾)クラス型である場合...

- Tが(おそらくCVで修飾された)非共用クラス型の場合...

- Tが配列型の場合、各要素は次のようになります。値の初期化。

- オブジェクトがゼロで初期化されます。タイプTの


8.5.5ゼロ初期化へのオブジェクトまたは参照意味:

を - Tは、スカラ型(3である場合。9)、オブジェクトは値0(ゼロ)に設定され、整数定数式としてTに変換されます。

+0

私はドキュメントのその部分を読んだことがありますが、私は意味がわかりませんでした。 "default-constructed"とは、size_tのような整数型の意味ですか? (標準を引用できますか?) – Suma

+0

@Suma:整数型はクラス型ではないので、コンストラクタはありません。これらの型の値を初期化することはゼロ初期化に等しい。 (第8章) –

+0

@KerrekSBあなたはC++とJavaを混同しないと確信していますか? Builtinsはデフォルトではありません。ゼロに構築します。 – spraff

0

どういう違いがありますか?クラス型オブジェクトの値の初期化にはデフォルトの構築が必要なので、答えは「両方」です。マップ<K, V>の場合、新しいオブジェクトはV()で初期化されます。

すべての標準的なコンテナは、値または直接初期化(後者はおそらくコピー構築による)で新しい要素を初期化します。新しい標準コンテナ要素が「初期化されていない」状態にあることはできません(つまり、のデフォルトは - 要素を初期化するメカニズムはありません)。

+0

私はクラスのintメンバ変数を使用するときのように、意味で "構築された"と仮定しました。デフォルトのクラスコンストラクタは値を初期化しません。私はあなたが正しいと思いますが、 "初期設定された"フレーズによって保証される値の初期化ですか? VがPODの場合はどうなりますか?デフォルトで構築される(つまり初期化されない)か、値が初期化されるか? – Suma

+0

@Suma: 'V'は値で初期化されるので、' V'が基本であればゼロで初期化され、クラス型であればデフォルトで構築されます。複合型の場合は、規則を再帰的に適用します。 –

関連する問題