4

私は最近、クラスの初期化と初期化リストで同時に持つことができないことを発見しました。次のコードは失敗します:

struct s
{
    int i=0;    
};
int main() {
    s s1; //s1.i = 0
    //s s2={42}; //fails
    return 0;
}

クラス内の初期化を削除すると、初期化子リストは正常に機能します!

そのようなことが許可されていない理由を誰かが説明できますか?

4

2 に答える 2

4

この初期化:

s s1 = { 42 };

集約sであるか、または int や.std::initializer_list

宣言の時点でメンバーの初期化を追加すると、クラスsが非集計になるため、集計の初期化を使用できなくなります。

コンストラクターを追加することで、非集計に同じ初期化構文を使用できます。

struct s
{
    s(int i) : i(i) {}
    int i=0;    
};

この制限は C++14 では緩和されたと思います。

詳細については、集計とは...を参照してください。

于 2013-10-18T14:42:08.347 に答える