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

C++ 添加到std::map的元素是否自动初始化?,c++,dictionary,initialization,C++,Dictionary,Initialization,假设我有一张地图 std::map foo 是我写foo[2]+=3.0时的行为定义?也就是说,在我的例子中,是否有任何隐式添加的映射元素自动初始化(希望是0.0) 如果不是,我是否引入了未定义行为的卡车负载?如果是这样的话,我是否可以使用分配器来强制初始化0.0?是的,当对不存在的键使用运算符[]时,它们会自动进行值初始化。具体而言,本标准在§23.4.4.3/1中有描述(当谈到操作员[]): 效果:如果地图中没有与x等价的键,则将value\u type(x,T())插入地图 对于大多数数字

假设我有一张地图

std::map foo

是我写
foo[2]+=3.0时的行为定义?也就是说,在我的例子中,是否有任何隐式添加的映射元素自动初始化(希望是
0.0


如果不是,我是否引入了未定义行为的卡车负载?如果是这样的话,我是否可以使用分配器来强制初始化
0.0

是的,当对不存在的键使用
运算符[]
时,它们会自动进行值初始化。具体而言,本标准在§23.4.4.3/1中有描述(当谈到
操作员[]
):

效果:如果地图中没有与x等价的键,则将
value\u type(x,T())
插入地图

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

是的,它将是(在您的情况下为
0.0
)。根据:

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

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

N3337[map.access]/1
效果:如果地图中没有与
x
等价的键,则在地图中插入
value\u type(x,T())


T()
是值初始化,这是内置类型导致零初始化的情况。同样地,
foo[2]
将在地图中插入一个初始化为零的
double
,因此您的代码定义良好

但是
double
实际上没有默认的构造函数。它们实际上是值初始化的,否则OP的代码会调用UB。@juanchopanza它实际上是为
double
。我在考虑默认初始化,因为您最初说它是默认构造的。默认初始化与值初始化不同。double没有默认构造函数。“否则初始化为零”。这是问题的关键。谢谢。这一直都是真的,还是仅仅在c++11中?C++11在填充默认值方面比以前做得更多,但我不知道这是否是其中之一contexts@AaronMcDaid在C++03中也是如此。@AaronMcDaid C++11为值初始化添加了更多语法,但值初始化的结果没有改变。@songyuanyao,据了解,有些东西从C++03变为C++11,意思是新的T()
。“具有动态存储持续时间的标量和POD类型被认为是未初始化的(自C++11以来,这种情况被重新分类为默认初始化形式)。”这就是为什么我很好奇C++03是否真的与C++11相同关于这个问题,可能是类似的更改(类似于该引用)已为
map
元素引入。但我想如果有区别,你链接的页面会这么说。相关: