29

std::map演算子 [] で存在しないキーにアクセスしようとすると、関数はそのキーを持つ新しい要素を挿入することがわかっています。

我々は持っています:std::map<std::string, bool> map_xxx;

map_xxx["nonexistent_key"]の存在しないキーにアクセスした後、2 番目の引数の値が常に になることが保証されていますfalseか?

ps。いいえの場合、この動作を行う方法はありますか?

4

1 に答える 1

39

はい。挿入される値は であることが保証されていますfalse


C++98 では、このメカニズムはデフォルトの初期化と呼ばれ、非クラスのゼロ初期化として指定されました。それfalseはブール値です。

C++03 以降、このメカニズムは値の初期化と呼ばれ、非クラスのゼロ初期化として指定されています。したがって、まだfalseブール値です。たとえば、C++14 がこれについて何と言っているか見てみましょう。

§23.4.4.3 から。bool「T」に置き換えるだけです。

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

  1. 効果: マップに x に相当するキーがない場合、value_type(x, T() ) をマップに挿入します。
  2. 必須: key_type は CopyInsertable であり、mapped_type は DefaultInsertable into *this でなければなりません。

§8.5 から、段落を下から上に要約します。

T 型のオブジェクトまたは参照をゼロで初期化するとは、次のことを意味します。

— T がスカラー型 (3.9) の場合、オブジェクトは、整数リテラル0 (ゼロ) を Tに変換して得られた値に初期化されます。

...

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

— T が (おそらく cv 修飾された) クラス型 (第 9 節) であり、デフォルト コンストラクターがない (12.1) か、ユーザー提供または削除されたデフォルト コンストラクターのいずれかである場合、オブジェクトはデフォルトで初期化されます。

— T が (おそらく cv 修飾された) クラス型であり、ユーザー提供または削除されたデフォルト コンストラクターがない場合、オブジェクトはゼロで初期化され、デフォルト初期化のセマンティック制約がチェックされ、T が非自明なデフォルトを持っている場合コンストラクター、オブジェクトはデフォルトで初期化されます。

— T が配列型の場合、各要素は値で初期化されます。

— それ以外の場合、オブジェクトはゼロで初期化されます

...

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

§4.12から:

算術、スコープなし列挙、ポインター、またはメンバー型へのポインターの prvalue は、bool 型の prvalue に変換できます。ゼロ値、null ポインター値、または null メンバー ポインター値は false に変換されます。その他の値は true に変換されます。直接初期化 (8.5) では、std::nullptr_t 型の prvalue を bool 型の prvalue に変換できます。結果の値は false です。

于 2012-06-15T21:30:52.350 に答える