使用= {}语法初始化结构时,引擎盖下发生了什么?

qfugit 发布于 2019-03-09 c++ 最后更新 2019-03-09 14:40 0 浏览

编辑基于评论稍微调整了一些示例 一个小代码然后问题(只是为了澄清,这是一个C++问题):

#include <cstdio>
struct MYSTRUCT1 {
  int asdf[4];
} MyStruct1;
struct MYSTRUCT2 {
  int asdf[4];
  MYSTRUCT2() : asdf() {}
} MyStruct2;
template <class T>
void test() {
  T blah = {{1,-1,1,-1}};
for( int ii = 0; ii < 4; ii++ ) {
    printf( "%d ", blah.asdf[ii] );
  }
  printf( "\n" );
}
int main() {
  // Works fine; MyStruct1 doesn't define a constructor
  test<MyStruct1>();
  // Doesn't work; g++ complains I need to use `-std=c++0x`
  // and/or define a constructor that allows the initialization
  // taking place inside `test()`
  test<MyStruct2>();
}
这里有几个问题:
  1. 发生了什么魔术让MyStruct1的实例能够以这种方式初始化
  2. 在c ++ 98中有没有解决这个问题的方法?
作为参考,我试图使用构造函数作为强制堆栈分配结构初始化为零的方法,但我不想禁止这种初始化方式。
已邀请:

vanimi

赞同来自:

What magic is going on that allows an instance of MyStruct1 to be initialized in that manner
嗯,这本身并没有“神奇”。 MyStruct1是聚合类型,但是由于ctor,MyStruct2不是。您正在尝试执行聚合初始化,这可能仅在聚合类型的对象上成功。
Is there a workaround for this in c++98?
让你的构造函数完成它的工作并获取初始化所需的参数。 试图使用构造函数首先对所有内容进行零初始化似乎你在C语言中有点半思考而在C++中有一半思考(通过使用CCS中几十年来没有要求的陈旧的typedef struct习语来进行相关)。