Visual C++ Compiler November 2013 CTP で noexcept が使えるようになったので、早速
iutest で noexcept を有効にしてビルドしたのですが、エラーになってしまいました。
再現コードはこちら。
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]三へ( へ՞ਊ ՞)へ ハッハッ
とりあえず、バグ報告しておいた。