我正在做一个简单的地图程序,但最终提出了这个问题。 cplusplus.com 说:
访问元素
如果
与容器中元素的键匹配,则该函数返回对其映射值的引用。k
如果
与容器中任何元素的键不匹配,该函数将使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素分配映射值(元素是使用其默认构造函数构造的),这始终会将容器大小增加一。k
我真正不明白的部分是它说“元素是使用其默认构造函数构造的”。
我尝试了一下,做了这个:
std::map<string, int> m;
m["toast"];
我只是想看看
"toast"
的映射元素是什么值,结果结果为零,但为什么呢?
基本类型是否有默认构造函数,或者发生了什么?
“使用其默认构造函数”的说法令人困惑。更准确地说,对于 std::map::operator[],如果键不存在,插入的值将是 value-initialized。
使用默认分配器时,这会导致键从键复制构造,并且映射值被值初始化。
对于
int
,它意味着零初始化。
4) 否则,该对象将被零初始化。
地图值由 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