[英]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.