2013年11月21日木曜日

VC++ Compiler November 2013 CTP の noexcept でバグ

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]三へ( へ՞ਊ ՞)へ ハッハッ

とりあえず、バグ報告しておいた。

0 件のコメント:

コメントを投稿