无序映射是否会创建零初始化结构?

时间:2018-03-21 23:31:12

标签: c++ struct unordered-map

我有一张无序地图,其密钥为var {google} = require('googleapis'); exports.moveDataFromGCStoPubSub = (event, callback) => { const file = event.data; const context = event.context; console.log(`Event ${context.eventId}`); console.log(` Event Type: ${context.eventType}`); console.log(` Bucket: ${file.bucket}`); console.log(` File: ${file.name}`); console.log(` Metageneration: ${file.metageneration}`); console.log(` Created: ${file.timeCreated}`); console.log(` Updated: ${file.updated}`); google.auth.getApplicationDefault(function (err, authClient, projectId) { if (err) { throw err; } console.log(projectId); const dataflow = google.dataflow({ version: 'v1b3', auth: authClient }); console.log(`gs://${file.bucket}/${file.name}`); dataflow.projects.templates.create({ projectId: projectId, resource: { parameters: { inputFile: `gs://${file.bucket}/${file.name}`, outputTopic: `projects/iot-fitness-198120/topics/MemberFitnessData`, }, jobName: 'CStoPubSub', gcsPath: 'gs://dataflow-templates/latest/GCS_Text_to_Cloud_PubSub', stagingLocation: 'gs://fitnessanalytics-tmp/tmp' } }, function(err, response) { if (err) { console.error("problem running dataflow template, error was: ", err); } console.log("Dataflow template response: ", response); callback(); }); }); callback(); };,值为int。如果找不到密钥,我希望地图创建零初始化struct

struct

调试时我可以看到struct TestStruct { int a; }; void foo() { std::unordered_map<int, TestStruct> map; TestStruct& test = map[1]; } 的值,但这是巧合吗?

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

1 个答案:

答案 0 :(得分:6)

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

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

来自[dcl.init]p8

  

value-initialize 类型为T的对象意味着:[...]如果T是[...]类类型而没有用户提供或删除的默认构造函数,那么该对象是零初始化[...]

来自[dcl.init]p6

  

零初始化类型为T的对象或引用意味着:[...]如果T是类类型,则其填充位(6.7)被初始化为零位   和每个非静态数据成员,每个非虚基类子对象,以及,如果对象不是基础   class子对象,每个虚拟基类子对象都是零初始化[...]

但是如果你的类有一个用户定义的默认构造函数,那么value-initialization将导致调用该构造函数。所以你的int是零真实的,但这只是因为你的课程特别简单。