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 中有解决方法吗?

作为参考,我试图使用构造函数作为强制堆栈分配的结构为零初始化的一种方式,但我不想禁止这种初始化方式。

4

1 回答 1

1

正在发生什么让 MyStruct1 的实例以这种方式初始化的魔法

好吧,本身没有“魔法”。MyStruct1是一个聚合类型,但多亏了 ctor,MyStruct2它不是。您正在尝试执行聚合初始化,这可能只在聚合类型的对象上成功。

在 c++98 中有解决方法吗?

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

尝试使用构造函数首先对所有内容进行零初始化似乎您在 C 中思考了一半,在 C++ 中思考了一半(与您使用typedef structC++ 几十年来不需要的过时习语相关)。

于 2013-04-11T16:42:48.333 回答