map operator []和bool作为值

时间:2012-06-15 21:28:01

标签: c++ stl map

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

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

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

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

1 个答案:

答案 0 :(得分:31)

是。要插入的值保证为false


在C ++ 98中,该机制称为默认初始化,指定为非类的零初始化;那是布林人的false

从C ++ 03开始,该机制被称为值初始化,仍然被指定为非类的零初始化;因此对于布尔人来说仍然是false。例如,让我们看看C ++ 14对此有何看法。

来自§23.4.4.3;只需用bool代替“T”。

  

<强>Ť&安培; operator [](const key_type&amp; x);

     
      
  1. 效果:如果地图中没有等效于x的键,请将value_type(x, T())插入地图。
  2.   
  3. 要求:key_type应为CopyInsertable,而mapped_type应为DefaultInsertable   *此。
  4.   

从§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。