std::map
演算子 [] で存在しないキーにアクセスしようとすると、関数はそのキーを持つ新しい要素を挿入することがわかっています。
我々は持っています:std::map<std::string, bool> map_xxx;
map_xxx["nonexistent_key"]
の存在しないキーにアクセスした後、2 番目の引数の値が常に になることが保証されていますfalse
か?
ps。いいえの場合、この動作を行う方法はありますか?
はい。挿入される値は であることが保証されていますfalse
。
C++98 では、このメカニズムはデフォルトの初期化と呼ばれ、非クラスのゼロ初期化として指定されました。それfalse
はブール値です。
C++03 以降、このメカニズムは値の初期化と呼ばれ、非クラスのゼロ初期化として指定されています。したがって、まだfalse
ブール値です。たとえば、C++14 がこれについて何と言っているか見てみましょう。
§23.4.4.3 から。bool
「T」に置き換えるだけです。
T & operator[](const key_type& x);
- 効果: マップに x に相当するキーがない場合、value_type(x, T() ) をマップに挿入します。
- 必須: 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 です。