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番目のプログラムの正しい動作は何ですか?
_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トランクの両方がそれに応じてこれを診断します。