私は最近、クラスの初期化と初期化リストで同時に持つことができないことを発見しました。次のコードは失敗します:
struct s
{
int i=0;
};
int main() {
s s1; //s1.i = 0
//s s2={42}; //fails
return 0;
}
クラス内の初期化を削除すると、初期化子リストは正常に機能します!
そのようなことが許可されていない理由を誰かが説明できますか?
私は最近、クラスの初期化と初期化リストで同時に持つことができないことを発見しました。次のコードは失敗します:
struct s
{
int i=0;
};
int main() {
s s1; //s1.i = 0
//s s2={42}; //fails
return 0;
}
クラス内の初期化を削除すると、初期化子リストは正常に機能します!
そのようなことが許可されていない理由を誰かが説明できますか?
この初期化:
s s1 = { 42 };
が集約s
であるか、または int や.std::initializer_list
宣言の時点でメンバーの初期化を追加すると、クラスs
が非集計になるため、集計の初期化を使用できなくなります。
コンストラクターを追加することで、非集計に同じ初期化構文を使用できます。
struct s
{
s(int i) : i(i) {}
int i=0;
};
この制限は C++14 では緩和されたと思います。
詳細については、集計とは...を参照してください。