我们知道如果我们尝试使用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);
- 效果:如果地图中没有等效于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开始:
算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为bool类型的prvalue.甲零值,空指针值,或空构件指针值被转换为假 ; 任何其他值都转换为true.对于直接初始化(8.5),std :: nullptr_t类型的prvalue可以转换为bool类型的prvalue; 结果值为false.
| 归档时间: |
|
| 查看次数: |
7865 次 |
| 最近记录: |