再現コードはこちら。
template<typename F> void f(F func) { func(); } void g() noexcept { } void h() { } int main() { f(g); // OK f(h); // error C2664 return 0; }
こちらを VC++ でビルドすると下記のエラーが発生します。
error C2664: 'void f<void(__cdecl *)(void) noexcept>(F)' : cannot convert argument 1 from 'void (__cdecl *)(void)' to 'void (__cdecl *)(void) noexcept'
f(g); をコメントアウトするとビルドが通ります。
f<void (*)()>(h); と書き換えてもエラーになります。
また、以下のように g と h を入れ替えてもビルドが通ります。
int main() { f(h); // OK f(g); // OK return 0; }
どうやら、先に noexcept 付きで実体化されると noexcept でないものまで noexcept を要求されるようです。
gcc では当然通る。
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
とりあえず、バグ報告しておいた。
0 件のコメント:
コメントを投稿