添加到std::map中的元素是否自动初始化?

Are elements added to a std::map automatically initialised?

本文关键字:是否 元素 初始化 std map 添加      更新时间:2023-10-16

假设我有一个地图

std::map<int, double> foo;

是我写的行为foo[2] += 3.0;定义?也就是说,是否有任何隐式添加的地图元素自动初始化(希望是0.0)在我的情况下?

如果没有,我是不是在引入一大堆未定义的行为?如果是这样,我可以做一些时髦的分配器来强制初始化0.0吗?

是的,它将被值初始化(在您的情况下为0.0)。根据cppreference:

返回对映射到等价键的值的引用键,如果该键不存在,则执行插入。

如果执行插入操作,则映射值为value-initialized(为类类型默认构造,否则为零初始化)和返回对它的引用。

N3337 [map.access]/1 Effects:如果map中没有与x对应的key,则将value_type(x,T())插入到map中

T() is value-initialization,这是内置类型导致零初始化的情况。因此,foo[2]将把零初始化的double插入到映射中,这样代码就定义良好了。

是的,当在不存在的键上使用operator[]时,它们会自动初始化值。具体来说,在标准中有§23.4.4.3/1的描述(当谈论operator[]时):

效果:如果map中没有x对应的键,则将value_type(x, T())插入到map中

对于大多数数字类型,包括double,表达式T()产生该类型的值初始化元素,因此在您的例子中产生0.0

相关文章: