0

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 でこれに対する回避策はありますか?

参考までに、スタックに割り当てられた構造体を強制的にゼロ初期化する手段としてコンストラクターを使用しようとしていますが、このスタイルの初期化を禁止したくありません。

4

1 に答える 1

1

MyStruct1 のインスタンスをその方法で初期化できるようにする魔法は何ですか

まあ、「魔法」自体はありません。MyStruct1集約型ですが、ctor のおかげでそうでMyStruct2はありません。集約型のオブジェクトでのみ成功する可能性がある、集約の初期化を実行しようとしています。

c++98 でこれに対する回避策はありますか?

コンストラクターにその仕事をさせ、初期化に必要な引数を取ります。

コンストラクターを使用して最初にすべてをゼロ初期化しようとすると、C で半分考え、C++ で半分考えているように見えます ( typedef structC++ では何十年も必要とされていなかった時代遅れのイディオムの使用と相関しています)。

于 2013-04-11T16:42:48.333 に答える