我有一张无序地图,其密钥为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];
}
的值,但这是巧合吗?
答案 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
是零真实的,但这只是因为你的课程特别简单。