【发布时间】:2015-08-27 10:52:45
【问题描述】:
假设我有一张地图
std::map<int, double> foo;
我写作foo[2] += 3.0; 的行为是否已定义?也就是说,在我的情况下,是否会自动初始化任何隐式添加的地图元素(希望是 0.0)?
如果不是,我是否会引入一大堆未定义的行为?如果是这样,我可以用分配器做一些时髦的事情来强制初始化为0.0吗?
【问题讨论】:
标签: c++ dictionary initialization
假设我有一张地图
std::map<int, double> foo;
我写作foo[2] += 3.0; 的行为是否已定义?也就是说,在我的情况下,是否会自动初始化任何隐式添加的地图元素(希望是 0.0)?
如果不是,我是否会引入一大堆未定义的行为?如果是这样,我可以用分配器做一些时髦的事情来强制初始化为0.0吗?
【问题讨论】:
标签: c++ dictionary initialization
是的,它将是value-initialized(在您的情况下为0.0)。根据cppreference:
返回对映射到等效键的值的引用 键,如果该键不存在则执行插入。
如果执行插入,映射的值是值初始化的 (为类类型默认构造,否则为零初始化)和 返回对它的引用。
【讨论】:
new T()的意思的C++11。 “具有动态存储持续时间的标量和 POD 类型被认为未初始化(从 C++11 开始,这种情况被重新归类为默认初始化的一种形式)。” 这就是为什么我很好奇 C关于这个问题,++03 确实与 C++11 相同,也许为map 元素引入了类似的更改(类似于该引用)。但我想如果有区别,你链接的页面会这样说。
N3337 [map.access]/1效果:如果映射中没有与x等效的键,则将value_type(x,T())插入映射中。
T() 是值初始化,这是内置类型的情况导致零初始化。因此,foo[2] 将在您的地图中插入一个零初始化的double,因此您的代码是明确定义的。
【讨论】:
是的,当在不存在的键上使用operator[] 时,它们会自动初始化值。特别是在第 23.4.4.3/1 节中描述的标准中(当谈到 operator[] 时):
效果:如果映射中没有与 x 等效的键,则将
value_type(x, T())插入映射中。
对于大多数数字类型,包括 double,表达式 T() 会生成该类型的值初始化元素,因此在您的情况下会生成 0.0。
【讨论】:
double 并没有真正的默认构造函数。
double。