繁体   English   中英

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

[英]When initializing a struct with ={} syntax, what's happening under the hood?

根据评论稍微编辑调整过的示例

一些代码然后出现问题(为澄清起见,这是一个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是聚合类型,但是由于ctor, MyStruct2不是聚合类型。 您正在尝试执行聚合初始化,这可能仅对聚合类型的对象成功。

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

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

尝试使用构造函数首先对所有内容进行零初始化,似乎您在C语言中有点想法,而在C ++中则有点想法(与使用数十年来C ++不需要的过时的typedef struct习惯相关)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM