繁体   English   中英

std::map::operator[]

[英]std::map::operator[]

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

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

我没有真正得到的部分是它说“元素是使用其默认构造函数构造的”。

我试了一下,做了这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM