次のコードは、GCCとClangで異なる結果をもたらします。誰が正しいですか?
union Foo {
struct {
int a;
int b;
};
};
struct Bar {
Bar(void) : test{.a = 1, .b = 2} { }
Foo test;
};
GCCで次のエラーが発生します(Clangで正常にコンパイルされます):
arcanis@/tmp # g++ -std=c++11 x.cpp
x.cpp: In constructor ‘Bar::Bar()’:
x.cpp:9:36: error: too many initializers for ‘Foo’
Bar(void) : test{.a = 1, .b = 2} { }
^
GCC4.9.1および次のオプションの使用:
-Wall -Wextra -std=c++11 -pedantic
これはあなたが得るものです:
prog.cc:7:5: warning: ISO C++ prohibits anonymous structs [-Wpedantic]
};
^
prog.cc: In constructor 'Bar::Bar()':
prog.cc:11:21: warning: ISO C++ does not allow C99 designated initializers [-Wpedantic]
Bar(void) : test{.a = 1, .b = 2} { }
^
prog.cc:11:28: warning: ISO C++ does not allow C99 designated initializers [-Wpedantic]
Bar(void) : test{.a = 1, .b = 2} { }
^
prog.cc:11:36: error: too many initializers for 'Foo'
Bar(void) : test{.a = 1, .b = 2} { }
^
同じオプションでClang3.5.0を使用すると、ほぼ同じことが得られます。
prog.cc:4:5: warning: anonymous structs are a GNU extension [-Wgnu-anonymous-struct]
struct {
^
prog.cc:11:22: warning: designated initializers are a C99 feature [-Wc99-extensions]
Bar(void) : test{.a = 1, .b = 2} { }
^~~~~~
prog.cc:11:30: warning: designated initializers are a C99 feature [-Wc99-extensions]
Bar(void) : test{.a = 1, .b = 2} { }
^~~~~~
要するに、警告メッセージに明確に示されている2つの理由から、これは有効なC ++ 11コードではありません。Clangはたまたまそれを許容し、エラーではなく警告のみを発行します。この場合、「誰が正しいか」について議論する価値があるかどうかはわかりません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加