9

次のコードは、gcc-4.7.1でもclang-3.2でも-std = c++11でコンパイルされません。だから私は何か間違ったことをしたと思います。でも理由はわかりません。誰かが私にヒントを与えることができますか?基本的に、Xのクラス内メンバー初期化子を削除すると、機能します。では、なぜ初期化子リストがクラス内のメンバー初期化子で機能しないのでしょうか。

struct X {
    int x = 1;
    int y = 1;
};

int main() {
    X x = {1, 2};
}

gccコンパイルエラー:

a.cpp: In function 'int main()':
a.cpp:7:16: error: could not convert '{1, 2}' from '<brace-enclosed initializer list>' to 'X'
4

1 に答える 1

12

宣言の時点で非静的データメンバーを初期化することにより、クラスは集約ではなくなります(8.5.1 Aggregates [decl.init.aggr]を参照)。

回避策は、2パラメーターのコンストラクターを追加することです。これにより、初期化子リストの初期化を使用できます。これにより、クラスが技術的に集約でなくても、集約の初期化と同じ構文が可能になります。

struct X {
  X(int x, int y) : x(x), y(y) {}
    int x = 1;
    int y = 1;
};

int main() 
{
    X x1{1, 2};
    X x2 = {1,2};
}

:これらのルールはC ++ 1yで緩和されています。つまり、タイプは実際に集合体になります。

于 2013-01-29T08:44:41.320 に答える