使用 ={} 语法初始化结构时,幕后发生了什么?



edit基于注释稍微调整了一下示例

一小段代码然后问题(只是为了澄清,这是一个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中有解决这个问题的方法吗?

作为参考,我试图使用构造函数作为强制堆栈分配结构进行零初始化的手段,但我不想禁止这种类型的初始化。

是什么魔法允许MyStruct1的实例以这种方式初始化

好吧,没有"魔法"本身。MyStruct1是聚集型,但由于有向量,MyStruct2不是聚集型。您正在尝试执行聚合初始化,这可能只在聚合类型的对象上成功。

在c++98中有解决这个问题的方法吗?

让构造函数完成它的工作并接受初始化所需的参数。

尝试使用构造函数首先零初始化一切似乎你在C和c++中都是半思考的(与你使用过时的typedef struct习惯用法相关,这在c++中已经几十年不需要了)。

最新更新