1. ホーム
  2. c++

[解決済み] コンストラクタのイニシャライザでメンバ配列を初期化する

2022-10-30 16:27:15

質問

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

配列の初期化が = という構文があるからです。

int arr[3] = {1,3,4};

質問

  1. やりたいことをやるにはどうしたらいいか(つまり です。 初期化 での配列の初期化です。 コンストラクタで配列を初期化することです(本体で要素を代入するのではありません を代入しない)。それは可能なのでしょうか?
  2. C++03 標準は、ctor 初期化子で集約体(配列を含む)を初期化することについて何か特別なことを言っていますか?または、上記のコードの無効性は、いくつかの他のルールの帰結ですか?
  3. C++0x のイニシャライザー リストで問題は解決されますか。

P.S. ベクトル、boost::array、そして私がよく知っている配列に対する優位性については言及しないでください。

どのように解決するのですか?

  1. やりたいこと(つまり、コンストラクタで配列を初期化する(本体で要素を代入しない))を実現するにはどうしたらよいでしょうか。可能なのでしょうか?

はい、配列を含む構造体を使用しています。そんなことはもう知っているとおっしゃいますが、では質問の意味がわかりません。そうすると、あなたは する で配列を初期化し、本文では代入しない。これは boost::array が行うものです。

C++03標準は、ctor初期化子で集合体(配列を含む)を初期化することについて何か特別なことを言っているのでしょうか?あるいは、上記のコードの無効性は、他の何らかのルールの帰結なのでしょうか?

mem-initializerは直接初期化を使用します。そして、条項8のルールはこのようなことを禁じています。以下のケースは正確にはわかりませんが、コンパイラによっては許可しているものもあります。

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

参照 このGCC PR を参照してください。

<ブロッククオート

C++0xのイニシャライザーリストは問題を解決してくれますか?

はい、そうです。しかし、あなたの構文は無効だと思います。リストの初期化を開始するには、中括弧を直接使用する必要があります。

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};