地图上count [x] ++的安全性如何

Ama*_*tam 3 c++ stl initialization

让我们假设我们有

map<int, int> count;
Run Code Online (Sandbox Code Playgroud)

如何安全(平台相关,编译器问题)是操作count[x]++;count[x] += value;在哪里xvalue是整数.

我想要观察的行为如下:

  • 如果密钥不存在,那么在执行之后count[x]++;,我应该将count[x]=1 ie int初始化为0.这会随平台而变化吗?
  • 如果存在,操作员应按预期工作,增加值.

作为参考,这里有一个关于类似问题的问题,但是它没有回答平台相关/编译器相关部分.

换句话说,将会count[x]++;count[x] += value;永远工作.

And*_*owl 11

如果密钥不存在,那么在执行count [x] ++;之后,我应该有count [x] = 1,即int应该为0初始化.这会随平台而变化吗?

不,它不会改变.该值将进行值初始化.因此,如果类型是基本类型,例如int,它将被初始化为0.这由C++ 11标准的第23.4.4.3/1段规定:

T& operator[](const key_type& x);
Run Code Online (Sandbox Code Playgroud)

1 效果:如果x地图中没有等效的键,则插入value_type(x, T())到地图中.

T()与值初始化相对应的事实在第8.5/17段中规定:

初始化器的语义如下.[...]

[...]

- 如果初始化程序为(),则对象进行值初始化.

[...]

最后,根据第8.5/8段:

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

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

- 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供或删除的默认构造函数,那么该对象是零初始化的,如果T有一个非平凡的默认构造函数,则默认初始化;

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

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

下一个问题:

如果存在,操作员应按预期工作,即增加值.

是(模运算符重载当然).