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

时间:2013-04-11 16:35:58

标签: c++ c++98 aggregate-initialization

编辑根据评论稍微调整一下示例

然后是一个小代码问题(只是为了澄清,这是一个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. 的魔法是什么
  3. c ++ 98中是否有解决方法?
  4. 作为参考,我试图使用构造函数来强制堆栈分配的结构初始化为零,但我不想禁止这种初始化方式。

1 个答案:

答案 0 :(得分:1)

  

允许以这种方式初始化MyStruct1实例的神奇之处

嗯,这本身没有“神奇”。 MyStruct1是一种聚合类型,但由于ctor,MyStruct2不是。您正在尝试执行聚合初始化,这可能仅在聚合类型的对象上成功。

  

c ++ 98中是否有解决方法?

让构造函数完成其工作并获取初始化所需的参数。

尝试使用构造函数首先对所有内容进行零初始化似乎你在C语言中有点半思考而在C ++中有一半思考(通过使用已经过时的typedef struct成语而非需要几十年来在C ++中。)