std::地图::运营商[]

std::map::operator[]

本文关键字:地图 std 运营商      更新时间:2023-10-16

我正在做一个简单的地图程序,但最终得到了这个问题。c++文档是这样说的:

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

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

我试了一下,做了这个

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

我只是想看看"toast"的映射元素是什么值。结果是0,为什么呢?基本类型有默认构造函数吗?或者发生了什么?

"使用其默认构造函数"的语句令人困惑。更准确地说,对于std::map::operator[],如果键不存在,则插入的值将被值初始化。

当使用默认分配器时,这将导致键是由键复制构造的,而映射的值是值初始化的。

对于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 (0);作为整型常量表达式,转换为T

[…]

所有引语摘自n4140