In C++17 noexcept has been added to the type system:
void r1( void (*f)() noexcept ) { f(); }
void foo() { throw 1; }
int main()
{
r1(foo);
}
The latest versions of GCC and Clang in C++17 mode reject the call r1(foo), because void (*)() cannot be implicitly converted to void (*)() noexcept.
But with std::function instead:
#include <functional>
void r2( std::function<void() noexcept> f ) { f(); }
void foo() { throw 1; }
int main()
{
r2(foo);
}
Clang accepts the program, apparently ignoring the noexcept specifier; and g++ gives a strange error regarding std::function<void() noexcept>.
What is the correct behaviour for this second program in C++17?