无序列图会创建一个零初始化结构吗?
Will an unordered map create a zero initialized struct?
我有一个无序列图,它有一个int
键和一个struct
值。如果找不到键,我希望映射创建一个零初始化struct
。
struct TestStruct
{
int a;
};
void foo()
{
std::unordered_map<int, TestStruct> map;
TestStruct& test = map[1];
}
调试时,我可以看到test.a == 0
的值,但这是巧合吗?
相关文章: C++ 结构有默认构造函数吗?
不,这不是巧合,是的,映射创建了一个零初始化结构。但是,让我们通过细节:
映射中的新元素是使用值初始化创建的;本质上是使用::new (address) T()
之类的东西。没有用户定义的默认构造函数(如TestStruct
)的类的值初始化意味着该对象为零初始化,因此所有非静态成员都是零初始化的。
从 [dcl.init]p8:
对 T 类型的对象进行值初始化意味着:[...] 如果
T
是没有用户提供或删除的默认构造函数的 [...] 类类型,则对象初始化为零 [...]
从 [dcl.init]p6:
对 T 类型的对象或引用进行零初始化意味着:[...] 如果
T
是 [...] 类类型,则其填充位 (6.7) 初始化为零位 以及每个非静态数据成员、每个非虚拟基类子对象,以及(如果该对象不是基对象) 类子对象,每个虚拟基类子对象都是零初始化的 [...]
但是,如果您的类具有用户定义的默认构造函数,则值初始化将导致调用该构造函数。因此,您的int
确实是零初始化的,但这只是因为您拥有特别简单的类。
相关文章:
- 构造函数在退出函数时无法初始化一个参数
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 'auto *x = new some_struct{};"是一个未初始化的变量?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 初始化类中的指针数组,并在另一个类中检索它
- C++,每个循环初始化一个新的静态变量
- 初始化一个由 p 指向的新 INTSTK,它最多可以存储 m 个
- 如何初始化一个标准::字符串数组?
- 我们如何初始化一个C++中所有值为 0 的向量
- C++ 警告:在一个声明中将截断从双精度初始化为浮点数,但在另一个声明中则不初始化
- 从C++调用 Python 类方法,如果给定一个初始化的类作为 PyObject
- C++11使variadic构造函数了解一个初始化列表的初始化列表
- 静态变量已用另一个初始化
- 与可以一个从另一个初始化的类的循环依赖关系
- 另一个初始化静态 C++ 类成员