c++ function c++17 noexcept

std:: función con noexcept en C++ 17



function c++17 (1)

En C ++ 17 noexcept se ha agregado noexcept al sistema de tipos :

void r1( void (*f)() noexcept ) { f(); } void foo() { throw 1; } int main() { r1(foo); }

Las últimas versiones de gcc y clang en modo C ++ 17 rechazan la llamada r1(foo) porque void (*)() no se puede convertir implícitamente a void (*)() noexcept .

Pero con std::function lugar:

#include <functional> void r2( std::function<void() noexcept> f ) { f(); } void foo() { throw 1; } int main() { r2(foo); }

clang acepta el programa, aparentemente ignorando el especificador noexcept ; y g ++ da un error extraño con respecto a std::function<void() noexcept> .

¿Cuál es el comportamiento correcto para este segundo programa en C ++ 17?


La definición de std::function no ha cambiado en el borrador de trabajo actual:

template<class T> class function; // not defined template<class R, class... ArgTypes> class function<R(ArgTypes...)> { /* ... */ };

Como void() noexcept no coincide con la especialización parcial, std::function<void() noexcept> es un tipo incompleto. Tanto el tronco Clang como el GCC diagnostican esto en consecuencia.