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?
std::function
's definition hasn't changed in the current working draft:Since
void() noexcept
doesn't match the partial specialization,std::function<void() noexcept>
is an incomplete type. Both Clang and GCC trunk diagnose this accordingly.