c++ - 无序映射会创建零初始化结构吗?

标签 c++ struct unordered-map

我有一个无序映射,它有一个 int 键和一个 struct 值。如果找不到 key ,我希望映射创建一个零初始化的 struct

struct TestStruct
{ 
   int a;
};

void foo()
{
   std::unordered_map<int, TestStruct> map;
   TestStruct& test = map[1];    
}

调试时我可以看到 test.a == 0 的值,但这是巧合吗?

相关帖子:Does a c++ struct have a default constructor?

最佳答案

不,这不是巧合,是的,映射创建了一个零初始化结构。但让我们来看看细节:

map 中的新元素是使用值初始化创建的;本质上是像 ::new (address) T() 这样的东西。没有用户定义的默认构造函数(例如 TestStruct)的类的值初始化意味着该对象是零初始化的,因此所有非静态成员都是零初始化的。

来自 [dcl.init]p8 :

To value-initialize an object of type T means: [...] if T is a [...] class type without a user-provided or deleted default constructor, then the object is zero-initialized [...]

来自 [dcl.init]p6 :

To zero-initialize an object or reference of type T means: [...] if T is a [...] class type, its padding bits (6.7) are initialized to zero bits and each non-static data member, each non-virtual base class subobject, and, if the object is not a base class subobject, each virtual base class subobject is zero-initialized [...]

但是如果您的类有一个用户定义的默认构造函数,那么值初始化将导致调用该构造函数。所以你的 int 确实是零初始化的,但这只是因为你拥有的类特别简单。

关于c++ - 无序映射会创建零初始化结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49418173/

相关文章:

c++ - 优化具有不规则内存访问的 CUDA 内核

C++ : Making a do while loop repeat

C++/GCC - 为什么编译

c - 指向另一个结构体的结构体指针

c++ - 为 unordered_set 重载 () 运算符

c++ - 字符串和 unordered_map 运行缓慢

c++ - Unordered.map 插入问题与对键

c++ - GStreamer-关键 ** : gst_mini_object_unref: assertion `GST_IS_MINI_OBJECT (mini_object)' failed

c - 如何计算 C 结构中的填充

c - 未定义的 C 结构前向声明