问题
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?
回答1:
std::function
's definition hasn't changed in the current working draft:
template<class T>
class function; // not defined
template<class R, class... ArgTypes>
class function<R(ArgTypes...)> {
/* ... */
};
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.
来源:https://stackoverflow.com/questions/41293025/stdfunction-with-noexcept-in-c17