このコードは有効ですか?GCCとClangは同意しません

マエルニソン

次のコードは、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]

編集
0

コメントを追加

0

関連記事

分類Dev

このコードは有効ですか?gccで動作し、clangでは動作しません

分類Dev

C ++関数からポインタへの暗黙の変換:どのコンパイラが正しいですか?ClangとGCCは同意しません

分類Dev

中括弧表記とinitializer_listを使用する場合、ClangとGCCはコンストラクターの選択に同意しません

分類Dev

clangでコードをコンパイルすることはできませんが、gccで動作します

分類Dev

これは有効なC ++コードですか?これは想定どおりに機能しません

分類Dev

これは有効なJavaコードですか?私の先生はそうだと言っていますが、私は本当にわかりません

分類Dev

AFAIK、以下のコードはコンパイルされるべきではありませんが、clangとGCCでコンパイルされます。ここで何が欠けていますか?

分類Dev

このCTADコードを拒否/受け入れるのにClangまたはGCCは正しいですか?

分類Dev

このCTADコードを拒否/受け入れるのにClangまたはGCCは正しいですか?

分類Dev

ブレースされたstd :: stringからstd :: string_viewを構築すると、clangとgccは-Wconversionに同意しません

分類Dev

Androidで難読化のみを有効にし、コードの縮小は有効にしませんか?

分類Dev

オーチャードコマンドラインは、モジュールが有効になっているのに無効になっていると言っています-UIから無効にすることはできません

分類Dev

このSassコードの違いは何ですか(一方は無効なcssエラーを出し、もう一方はしません)?

分類Dev

静的テーブルの生成はGCCで機能しますが、clangでは機能しません。clangはバグがありますか?

分類Dev

gccは、ネストされた汎用ラムダを使用してこのコードを受け入れ、clangは拒否します。なぜですか?

分類Dev

GCCとClangはフィールドごとの構造体コピーを最適化しますか?

分類Dev

「'collaborators..$conditionalHandlers' のドル ($) 接頭辞フィールド '$conditionalHandlers' は、ストレージとして有効ではありません。」の原因は何ですか。

分類Dev

MSVCはこのメソッド呼び出しがあいまいであると判断する権利がありますが、Clang / GCCはそうではありませんか?

分類Dev

noexcept指定子が不思議なことにコンパイルを壊します(clang、gccが同意しません)

分類Dev

SKActionアニメーションの後で、タッチを無効にしてから再度有効にすることはできません

分類Dev

空のリストに同意することはできません

分類Dev

std :: mapから派生したクラスはVisualC ++ではコンパイルされません(ただし、gccとclangでコンパイルされます)

分類Dev

fiddlerコアの自動ストリーミングを無効にすることはできませんか?

分類Dev

有効なユーザー名とパスワードでPuTTyを使用してSSH接続することはできません。サーバーとPuTTyキーボード/端末が同じであることを確認するにはどうすればよいですか?その他の問題?

分類Dev

std :: make_sharedは値の初期化を実行しますか(GCCとclangは一致しません)?

分類Dev

Makeはgcc以外のコマンド(レシピ)を見ることができませんでした

分類Dev

このコード行を完全に理解することはできません

分類Dev

GCC最適化を有効にすると、strlenを使用するこのコードが6.5倍遅くなるのはなぜですか?

分類Dev

clang形式でコードを壊すことはできますか?

Related 関連記事

  1. 1

    このコードは有効ですか?gccで動作し、clangでは動作しません

  2. 2

    C ++関数からポインタへの暗黙の変換:どのコンパイラが正しいですか?ClangとGCCは同意しません

  3. 3

    中括弧表記とinitializer_listを使用する場合、ClangとGCCはコンストラクターの選択に同意しません

  4. 4

    clangでコードをコンパイルすることはできませんが、gccで動作します

  5. 5

    これは有効なC ++コードですか?これは想定どおりに機能しません

  6. 6

    これは有効なJavaコードですか?私の先生はそうだと言っていますが、私は本当にわかりません

  7. 7

    AFAIK、以下のコードはコンパイルされるべきではありませんが、clangとGCCでコンパイルされます。ここで何が欠けていますか?

  8. 8

    このCTADコードを拒否/受け入れるのにClangまたはGCCは正しいですか?

  9. 9

    このCTADコードを拒否/受け入れるのにClangまたはGCCは正しいですか?

  10. 10

    ブレースされたstd :: stringからstd :: string_viewを構築すると、clangとgccは-Wconversionに同意しません

  11. 11

    Androidで難読化のみを有効にし、コードの縮小は有効にしませんか?

  12. 12

    オーチャードコマンドラインは、モジュールが有効になっているのに無効になっていると言っています-UIから無効にすることはできません

  13. 13

    このSassコードの違いは何ですか(一方は無効なcssエラーを出し、もう一方はしません)?

  14. 14

    静的テーブルの生成はGCCで機能しますが、clangでは機能しません。clangはバグがありますか?

  15. 15

    gccは、ネストされた汎用ラムダを使用してこのコードを受け入れ、clangは拒否します。なぜですか?

  16. 16

    GCCとClangはフィールドごとの構造体コピーを最適化しますか?

  17. 17

    「'collaborators..$conditionalHandlers' のドル ($) 接頭辞フィールド '$conditionalHandlers' は、ストレージとして有効ではありません。」の原因は何ですか。

  18. 18

    MSVCはこのメソッド呼び出しがあいまいであると判断する権利がありますが、Clang / GCCはそうではありませんか?

  19. 19

    noexcept指定子が不思議なことにコンパイルを壊します(clang、gccが同意しません)

  20. 20

    SKActionアニメーションの後で、タッチを無効にしてから再度有効にすることはできません

  21. 21

    空のリストに同意することはできません

  22. 22

    std :: mapから派生したクラスはVisualC ++ではコンパイルされません(ただし、gccとclangでコンパイルされます)

  23. 23

    fiddlerコアの自動ストリーミングを無効にすることはできませんか?

  24. 24

    有効なユーザー名とパスワードでPuTTyを使用してSSH接続することはできません。サーバーとPuTTyキーボード/端末が同じであることを確認するにはどうすればよいですか?その他の問題?

  25. 25

    std :: make_sharedは値の初期化を実行しますか(GCCとclangは一致しません)?

  26. 26

    Makeはgcc以外のコマンド(レシピ)を見ることができませんでした

  27. 27

    このコード行を完全に理解することはできません

  28. 28

    GCC最適化を有効にすると、strlenを使用するこのコードが6.5倍遅くなるのはなぜですか?

  29. 29

    clang形式でコードを壊すことはできますか?

ホットタグ

アーカイブ