我们知道,如果我们尝试使用std::map
运算符 [] 访问一个不存在的键,该函数将使用该键插入一个新元素。
我们有:std::map<std::string, bool> map_xxx;
是否保证在访问不存在的键后map_xxx["nonexistent_key"]
,第二个参数的值将始终为false
?
附言。如果没有,任何想法如何有这种行为?
是的。保证要插入的值是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 到 *this。
从第 8.5 节开始,自下而上消化段落:
对 T 类型的对象或引用进行零初始化意味着:
— 如果 T 是标量类型(3.9),则将对象初始化为通过将整数文字0(零)转换为 T 获得的值;
...
对T 类型的对象进行值初始化意味着:
— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),没有默认构造函数(12.1)或用户提供或删除的默认构造函数,则对象被默认初始化;
— 如果 T 是一个(可能是 cv 限定的)类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化并检查默认初始化的语义约束,如果 T 具有非平凡的默认值构造函数,对象是默认初始化的;
— 如果 T 是一个数组类型,那么每个元素都是值初始化的;
— 否则,对象是零初始化的。
...
初始值设定项为空括号集的对象,即(),应进行值初始化。
从§4.12:
算术、无范围枚举、指针或指向成员类型的指针的纯右值可以转换为 bool 类型的纯右值。零值、空指针值或空成员指针值转换为 false;任何其他值都将转换为 true。对于直接初始化 (8.5),std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值;结果值为假。