В С++ 17 noexcept добавлен в систему типов:
void r1( void (*f)() noexcept ) { f(); }
void foo() { throw 1; }
int main()
{
r1(foo);
}
Последние версии gcc и clang в режиме С++ 17 отклоняют вызов 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>.
Какое правильное поведение для этой второй программы в С++ 17?