map operator []和bool作为值

abr*_*hab 24 c++ stl map

我们知道如果我们尝试使用std::mapoperator [] 访问不存在的键,该函数将使用该键插入一个新元素.

我们有: std::map<std::string, bool> map_xxx;

是否保证在访问不存在的密钥后map_xxx["nonexistent_key"],第二个参数的值将始终为false

PS.如果没有,任何想法如何有这种行为?

Jir*_*ika 33

是.要插入的值保证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为*this.

从§8.5开始,从下到上消化段落:

零初始化T类型的对象或引用意味着:

- 如果T是标量类型(3.9),则将对象初始化为通过整数0(零)转换为T而获得的值;

...

类型T的对象进行值初始化意味着:

- 如果T是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或者是用户提供或删除的默认构造函数,那么该对象是默认初始化的;

- 如果T是一个(可能是cv限定的)类类型而没有用户提供或删除的默认构造函数,则该对象被零初始化并且检查默认初始化的语义约束,并且如果T具有非平凡的默认值构造函数,该对象是默认初始化的;

- 如果T是数组类型,则每个元素都是值初始化的;

- 否则,对象被零初始化.

...

初始值为空集括号的对象,即(),应进行值初始化.

从§4.12开始:

算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.甲零值,空指针值,或空构件指针值被转换为假 ; 任何其他值都转换为true.对于直接初始化(8.5),std :: nullptr_t类型的prvalue可以转换为bool类型的prvalue; 结果值为false.