Ama*_*tam 3 c++ stl initialization
让我们假设我们有
map<int, int> count;
Run Code Online (Sandbox Code Playgroud)
如何安全(平台相关,编译器问题)是操作count[x]++;或count[x] += value;在哪里x和value是整数.
我想要观察的行为如下:
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段规定:
Run Code Online (Sandbox Code Playgroud)T& operator[](const key_type& x);1 效果:如果
x地图中没有等效的键,则插入value_type(x, T())到地图中.
T()与值初始化相对应的事实在第8.5/17段中规定:
初始化器的语义如下.[...]
[...]
- 如果初始化程序为
(),则对象进行值初始化.[...]
最后,根据第8.5/8段:
对值初始化类型的对象
T意味着:- 如果
T是一个(可能是cv限定的)类类型(第9条),没有默认构造函数(12.1)或者是用户提供或删除的默认构造函数,那么该对象是默认初始化的;- 如果
T是一个(可能是cv限定的)非联合类类型而没有用户提供或删除的默认构造函数,那么该对象是零初始化的,如果T有一个非平凡的默认构造函数,则默认初始化;- 如果
T是数组类型,则每个元素都是值初始化的;- 否则,对象被零初始化.
下一个问题:
如果存在,操作员应按预期工作,即增加值.
是(模运算符重载当然).