std::map::operator[] 如何初始化值(尤其是基本类型)?

问题描述 投票:0回答:2

我正在做一个简单的地图程序,但最终提出了这个问题。 cplusplus.com 说:

访问元素

如果

k
与容器中元素的键匹配,则该函数返回对其映射值的引用。

如果

k
与容器中任何元素的键不匹配,该函数将使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素分配映射值(元素是使用其默认构造函数构造的),这始终会将容器大小增加一。

我真正不明白的部分是它说“元素是使用其默认构造函数构造的”。

我尝试了一下,做了这个:

std::map<string, int> m;
m["toast"];

我只是想看看

"toast"
的映射元素是什么值,结果结果为零,但为什么呢? 基本类型是否有默认构造函数,或者发生了什么?

c++ dictionary initialization stdmap
2个回答
6
投票

“使用其默认构造函数”的说法令人困惑。更准确地说,对于 std::map::operator[],如果键不存在,插入的值将是 value-initialized

使用默认分配器时,这会导致键从键复制构造,并且映射值被值初始化

对于

int
,它意味着零初始化

4) 否则,该对象将被零初始化。


2
投票

地图值由 operator[]

值初始化
,对于
int
意味着零初始化。

按照标准 (§23.4.4.3) 的定义:

效果:如果地图中没有与x等效的键,则将

value_type(x, T())
插入到地图中。

T()
解释为(§8.5/10):

初始化器是一组空括号的对象,即

()
,应进行值初始化

这意味着(§8.5/8):

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

[...]

—否则,该对象将被零初始化。

零初始化定义为(§8.5/6):

T
类型的对象或引用进行零初始化意味着:

— 如果 T 是标量类型,则该对象设置为值 0(零), 视为积分常量表达式,转换为

T

[...]

所有引述均取自n4140

© www.soinside.com 2019 - 2024. All rights reserved.