std::map 中基元类型的值是否初始化
Is the value of primitive types in std::map initialized?
请考虑以下代码:
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 是 int
,int()
是 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);
- 效果:如果映射中没有与
x
等效的键,则在映射中插入value_type(x, T())
。
因此,正如约瑟夫·加文的回答所述,表达式mapped_type()
的结果就是插入的内容。 这种初始化称为值初始化。
对于类类型,值初始化的含义并不像其他答案中提供的那么简单。这取决于类类型具有哪种构造函数,以及类是否为聚合,如 cppreference 链接所述。
对于int
如本问题,值初始化意味着int
设置为 0
。
相关文章:
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- 无法使用类型为"结构节点 *"的左值初始化类型为"结构节点 *"的参数
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 零初始化类型
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 类型值不能用于初始化类型实体
- 无效初始化类型的 BinaryNode *& 的非常量引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- 直接或通过构造函数初始化类型的类
- 无法使用 'Shape *' 类型的左值初始化类型 'Shape Shape::*' 的返回对象
- C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效
- 从类型为"矩阵"的右值初始化类型为"矩阵"的非常量引用无效
- 无法使用类型 'const char [X]' 的左值初始化类型 'const signed char *' 的成员子对象
- C 我可以用双重初始化类型浮点的变量
- 无法识别初始化类型