web-dev-qa-db-ja.com

std :: function with noexcept in C ++ 17

C++ 17ではnoexcept型システムに追加されました

_void r1( void (*f)() noexcept ) { f(); }
void foo() { throw 1; }

int main()
{
    r1(foo);
}
_

C++ 17モードのGCCおよびClangの最新バージョンは、r1(foo)を暗黙的にvoid (*)()に変換できないため、void (*)() noexceptの呼び出しを拒否します。

ただし、代わりに_std::function_を使用します。

_#include <functional>

void r2( std::function<void() noexcept> f ) { f(); }
void foo() { throw 1; }

int main()
{
    r2(foo);
}
_

Clangはプログラムを受け入れ、明らかにnoexcept指定子を無視します。 _g++_は、std::function<void() noexcept>に関して奇妙なエラーを出します。

C++ 17でのこの2番目のプログラムの正しい動作は何ですか?

25
M.M

_std::function_の定義は、現在の作業ドラフトでは変更されていません。

_template<class T>
class function; // not defined

template<class R, class... ArgTypes>
class function<R(ArgTypes...)> {
    /* ... */
};
_

void() noexceptは部分的な特殊化と一致しないため、std::function<void() noexcept>は不完全な型です。 ClangとGCCトランクの両方がそれに応じてこれを診断します。

20
T.C.