私は最近、clangとgccの奇妙な動作を発見しました。私は、そのメンバーの一人のために、クラスの初期化を使用して構造体(MyClass
)(active
)を持っている:clangとgccは、クラス内の初期化で構造体のブレースされた初期化を異なる方法で扱うのはなぜですか?
struct MyClass {
int something;
bool active = true;
};
今私は中括弧で初期化するために、このクラスを試してみてください。打ち鳴らすを使用して
、私は初期化子リスト(MyClass a = { 42, true};
)か、しない(MyClass a = { 42 };
)でactive
を含めるかどうかを決定することができます。
しかし、gccを使用すると、active
が含まれていないと私のコードだけがコンパイルされます。そうでなければ、次のコンパイラエラーが発生します:
error: could not convert ‘{42, true}’ from ‘<brace-enclosed initializer list>’ to ‘MyClass’
これはバグですか?スタンダードはそれについて何を言いますか? VSC++はどうですか?ポータブルソリューションとしてどちらの方法をお勧めしますか?
Debian Linuxではgcc 4.9とclang 3.5を使用してテストされています。
両方でC++ 14モードでコンパイルしていますか? – juanchopanza
はい、あります。私もすべての警告を有効にしました。「ウォール」は1つしかありません。 – user3684240
C++ 11では、[非静的なクラス内メンバー初期化子を持つクラスは集約ではありません](http://stackoverflow.com/q/27118535/1708801)、これはC++ 11モードでは失敗しますが両方ともC++ 14モードで成功するはずです。私は私の[回答](http://stackoverflow.com/a/27118551/1708801)にリンクされている質問にgccがこれまで5.0をサポートしていなかったことに注意しています。 –