我们知道如果我们尝试使用operator []访问std::map
的不存在的键,该函数将使用该键插入一个新元素。
我们有:std::map<std::string, bool> map_xxx;
是否可以保证在访问map_xxx["nonexistent_key"]
的不存在的密钥后,第二个参数的值将始终为false
?
PS。如果没有,任何想法如何有这种行为?
答案 0 :(得分:31)
是。要插入的值保证为false
。
在C ++ 98中,该机制称为默认初始化,指定为非类的零初始化;那是布林人的false
。
从C ++ 03开始,该机制被称为值初始化,仍然被指定为非类的零初始化;因此对于布尔人来说仍然是false
。例如,让我们看看C ++ 14对此有何看法。
来自§23.4.4.3;只需用bool
代替“T”。
<强>Ť强>&安培; operator [](const key_type&amp; x);
- 效果:如果地图中没有等效于x的键,请将value_type(x, T())插入地图。
- 要求:key_type应为CopyInsertable,而mapped_type应为DefaultInsertable *此。
醇>
从§8.5开始,从下到上消化段落:
零初始化T类型的对象或引用意味着:
- 如果T是标量类型(3.9),则将对象初始化为将转换整数字 0 (零)获得的值为T;
...
要值初始化,T类型的对象意味着:
- 如果T是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或者是用户提供或删除的默认构造函数,那么该对象是默认初始化的;
- 如果T是没有用户提供或删除的默认构造函数的(可能是cv限定的)类类型,则对象被零初始化并且检查默认初始化的语义约束,并且如果T具有非-trivial默认构造函数,该对象是默认初始化的;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,该对象零初始化。
...
一个对象,其初始化程序是一组空的括号,即(),应为值初始化。
来自§4.12:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue。 零值,空指针值或空成员指针值将转换为false ;任何其他值都转换为true。对于直接初始化(8.5),std :: nullptr_t类型的prvalue可以转换为bool类型的prvalue;结果值为false。