std::map 中基元类型的值是否初始化

Is the value of primitive types in std::map initialized?

本文关键字:初始化 类型 是否 map std      更新时间:2023-10-16

请考虑以下代码:

map<int,int> m;
for(int i=0;i<10000;++i) m[i]++;
for(int i=0;i<10000;++i) printf("%d",m[i]);

我认为打印出来的值是未定义的,因为基元类型没有默认构造函数,但在这里我每次测试时都会得到 10000 个 1。

为什么要初始化?

当调用operator[]并且缺少键时,使用表达式 mapped_type() 初始化值,表达式 是类类型的默认构造函数,整型类型的初始化为零。

std::map::operator[] 插入新值(如果不存在(。如果执行插入,则映射值由类类型的默认构造函数初始化,否则初始化为零。

参见 https://www.sgi.com/tech/stl/stl_map.h

  _Tp& operator[](const key_type& __k) {
    iterator __i = lower_bound(__k);
    // __i->first is greater than or equivalent to __k.
    if (__i == end() || key_comp()(__k, (*__i).first))
      __i = insert(__i, value_type(__k, _Tp()));
    return (*__i).second;
  }

在您的示例中,_Tp 是 intint() 是 0

#include <iostream>
using namespace std;
int main() {
  int x = int();
  cout << x << endl;
  return 0;
}

另外:

感谢@MSalters告诉上面代码的是SGI而不是std::map,但我认为它有点像...

在 C++14 标准中,第 [map.access] 节的文本是:

T& operator[](const key_type& x);

  1. 效果:如果映射中没有与x等效的键,则在映射中插入value_type(x, T())

因此,正如约瑟夫·加文的回答所述,表达式mapped_type()的结果就是插入的内容。 这种初始化称为值初始化。

对于类类型,值初始化的含义并不像其他答案中提供的那么简单。这取决于类类型具有哪种构造函数,以及类是否为聚合,如 cppreference 链接所述。

对于int如本问题,值初始化意味着int设置为 0

相关文章: