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

Lingxi

問題のコードは

#include <functional>
#include <utility>

template <typename F>
void for_each(F&&) noexcept {}

template <typename F, typename T, typename... Us>
void for_each(F&& f, T&& v, Us&&... us) {
  std::invoke(std::forward<F>(f), std::forward<T>(v));
  for_each(std::forward<F>(f), std::forward<Us>(us)...);
}

void func(void*) noexcept {}

int main() {
  for_each(func, nullptr);
}

gcc 8コンパイルされますが、clang6では次のエラーで失敗します。

/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4198:19: error: invalid application of 'sizeof' to a function type
    static_assert(sizeof(_Tp) > 0, "Type must be complete.");
                  ^~~~~~~~~~~
/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4203:15: note: in instantiation of template class 'std::__1::__check_complete<void (void *) noexcept>' requested here
    : private __check_complete<_Tp>
              ^
/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4496:15: note: in instantiation of template class 'std::__1::__check_complete<void (&)(void *) noexcept>' requested here
    : private __check_complete<_Fp>
              ^
/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4559:9: note: in instantiation of template class 'std::__1::__invokable_r<void, void (&)(void *) noexcept, nullptr_t &&>' requested here
        __invokable<_Fp, _Args...>::value,
        ^
/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4568:14: note: in instantiation of template class 'std::__1::__invoke_of<void (&)(void *) noexcept, nullptr_t &&>' requested here
    : public __invoke_of<_Fp, _Args...>
             ^
/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4573:22: note: in instantiation of template class 'std::__1::result_of<void (&(nullptr_t &&))(void *) noexcept>' requested here
template <class _Tp> using result_of_t = typename result_of<_Tp>::type;
                     ^
/opt/wandbox/clang-6.0.0/include/c++/v1/functional:2349:1: note: in instantiation of template type alias 'result_of_t' requested here
result_of_t<_Fn&&(_Args&&...)>
^
prog.cc:9:3: note: while substituting deduced template arguments into function template 'invoke' [with _Fn = void (&)(void *) noexcept, _Args = <nullptr_t>]
  std::invoke(std::forward<F>(f), std::forward<T>(v));
  ^
prog.cc:16:3: note: in instantiation of function template specialization 'for_each<void (&)(void *) noexcept, nullptr_t>' requested here
  for_each(func, nullptr);
  ^
1 error generated.

noexcept指定子を削除しますfunc()

void func(void*) /* noexcept */ {}

その後、コンパイルします。わかりません。これはコンパイラのバグですか?

Rockets1111

うーん、ダメ。libc ++はnoexceptマークされた関数の処理に失敗します。関数がそうであるときに、その機械が何らかの理由で失敗しnoexcept、間違った部分的な特殊化(関数用ではないオブジェクト用のもの)を取っているように見えます。

sizeof関数を取得できないので、clangは正しく文句を言います(そしてgccも文句を言います)。

回避策として、関数ポインターを渡します。

for_each(&func, nullptr);

修正されたバグレポートを記入しました:)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Jsonファイル読み取り関数が不思議なことに電子でnullを返します

分類Dev

Numpyが不思議なことに動作を停止しました

分類Dev

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

分類Dev

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

分類Dev

非常に不思議なループ動作:リストはアイデンティティを変更します。何が起こっている?

分類Dev

Ansible Chocolateyが不思議なことに失敗しましたか?

分類Dev

C-char配列を使用すると、fgetsが不思議なことにセグメンテーション違反を引き起こします

分類Dev

不思議なphpファイルが表示されました。それが何であるかを理解するのを手伝ってくれませんか。

分類Dev

jQueryの「スワイパー」プラグインが不思議なことに機能しない

分類Dev

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

分類Dev

インラインと明示的なメンバー制約を組み合わせると、不思議なエラーが発生します

分類Dev

JPA @ ElementCollectionが不思議なことにキャッシュされました

分類Dev

SwiftUICollectionViewセルが不思議なことに繰り返されます

分類Dev

GCC-4.9.1_x64でClangをコンパイルしているときに、コマンドの構文が正しくありません

分類Dev

不思議なことに繰り返しテンプレートパターン(CRTP)が機能する理由

分類Dev

Capistranoによって開始されると、Sidekiqが起動し、不思議なことに消えます

分類Dev

テンプレート関数へのポインタを含むイニシャライザリストをコンパイルするときに、gccでエラーが発生しましたが、clangではエラーが発生しません

分類Dev

Ubuntuオーディオが不思議なことに動作を停止しました(12.04)

分類Dev

Ubuntuオーディオが不思議なことに動作を停止しました(12.04)

分類Dev

Xfce4はログイン時に不思議なことにファイルブラウザを起動します

分類Dev

UIAlertController(アクションシートスタイル)を提示すると、不思議な自動レイアウト警告が発生しました

分類Dev

IOCreatePlugInInterfaceForServiceが不思議なエラーを返します

分類Dev

コンパイラエラーC4430:型指定子がありません-intと見なされます

分類Dev

whileループとifステートメントを使用する非常に基本的なプログラムはコンパイルされますが機能しません-私はそれがすべて正しいと思いますか?

分類Dev

不思議なことに、window.documentは、理想的には返すべき適切なオブジェクトを返していません。どうして?

分類Dev

Android Javaの特定の無関係なコードの後で、ファイル変数が不思議なことに空になります

分類Dev

不思議なタスクバーアイコンを特定しようとしています

分類Dev

clangはこのスニペットをColiruでコンパイルしますが、CompilerExplorerではコンパイルしません。どうして?

分類Dev

不思議なa.outファイルがダウンロードフォルダに表示されました

Related 関連記事

  1. 1

    Jsonファイル読み取り関数が不思議なことに電子でnullを返します

  2. 2

    Numpyが不思議なことに動作を停止しました

  3. 3

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

  4. 4

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

  5. 5

    非常に不思議なループ動作:リストはアイデンティティを変更します。何が起こっている?

  6. 6

    Ansible Chocolateyが不思議なことに失敗しましたか?

  7. 7

    C-char配列を使用すると、fgetsが不思議なことにセグメンテーション違反を引き起こします

  8. 8

    不思議なphpファイルが表示されました。それが何であるかを理解するのを手伝ってくれませんか。

  9. 9

    jQueryの「スワイパー」プラグインが不思議なことに機能しない

  10. 10

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

  11. 11

    インラインと明示的なメンバー制約を組み合わせると、不思議なエラーが発生します

  12. 12

    JPA @ ElementCollectionが不思議なことにキャッシュされました

  13. 13

    SwiftUICollectionViewセルが不思議なことに繰り返されます

  14. 14

    GCC-4.9.1_x64でClangをコンパイルしているときに、コマンドの構文が正しくありません

  15. 15

    不思議なことに繰り返しテンプレートパターン(CRTP)が機能する理由

  16. 16

    Capistranoによって開始されると、Sidekiqが起動し、不思議なことに消えます

  17. 17

    テンプレート関数へのポインタを含むイニシャライザリストをコンパイルするときに、gccでエラーが発生しましたが、clangではエラーが発生しません

  18. 18

    Ubuntuオーディオが不思議なことに動作を停止しました(12.04)

  19. 19

    Ubuntuオーディオが不思議なことに動作を停止しました(12.04)

  20. 20

    Xfce4はログイン時に不思議なことにファイルブラウザを起動します

  21. 21

    UIAlertController(アクションシートスタイル)を提示すると、不思議な自動レイアウト警告が発生しました

  22. 22

    IOCreatePlugInInterfaceForServiceが不思議なエラーを返します

  23. 23

    コンパイラエラーC4430:型指定子がありません-intと見なされます

  24. 24

    whileループとifステートメントを使用する非常に基本的なプログラムはコンパイルされますが機能しません-私はそれがすべて正しいと思いますか?

  25. 25

    不思議なことに、window.documentは、理想的には返すべき適切なオブジェクトを返していません。どうして?

  26. 26

    Android Javaの特定の無関係なコードの後で、ファイル変数が不思議なことに空になります

  27. 27

    不思議なタスクバーアイコンを特定しようとしています

  28. 28

    clangはこのスニペットをColiruでコンパイルしますが、CompilerExplorerではコンパイルしません。どうして?

  29. 29

    不思議なa.outファイルがダウンロードフォルダに表示されました

ホットタグ

アーカイブ