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.