c++ c++11 gcc clang noexcept

c++ - el especificador de noexcept rompe misteriosamente la compilación(clang, gcc no está de acuerdo)



c++11 (1)

Bueno no. libc ++ no puede manejar las noexcept marcadas noexcept . Parece que su maquinaria falla por alguna razón cuando la función es noexcept y toma la especialización parcial incorrecta (la de los objetos no de las funciones).

Como no puede tomar el sizeof de una función, Clang se queja (y gcc también lo haría).

Como solución alternativa, pase un puntero a una función:

for_each(&func, nullptr);

Llené un informe de error , que fue corregido! :)

El código en cuestión es

#include <functional> #include <utility> template <typename F> void for_each(F&&) noexcept {} template <typename F, typename T, typename... Us> void for_each(F&& f, T&& v, Us&&... us) { std::invoke(std::forward<F>(f), std::forward<T>(v)); for_each(std::forward<F>(f), std::forward<Us>(us)...); } void func(void*) noexcept {} int main() { for_each(func, nullptr); }

Se compila en gcc 8 , pero falla en el Clang 6 con el siguiente error:

/opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4198:19: error: invalid application of ''sizeof'' to a function type static_assert(sizeof(_Tp) > 0, "Type must be complete."); ^~~~~~~~~~~ /opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4203:15: note: in instantiation of template class ''std::__1::__check_complete<void (void *) noexcept>'' requested here : private __check_complete<_Tp> ^ /opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4496:15: note: in instantiation of template class ''std::__1::__check_complete<void (&)(void *) noexcept>'' requested here : private __check_complete<_Fp> ^ /opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4559:9: note: in instantiation of template class ''std::__1::__invokable_r<void, void (&)(void *) noexcept, nullptr_t &&>'' requested here __invokable<_Fp, _Args...>::value, ^ /opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4568:14: note: in instantiation of template class ''std::__1::__invoke_of<void (&)(void *) noexcept, nullptr_t &&>'' requested here : public __invoke_of<_Fp, _Args...> ^ /opt/wandbox/clang-6.0.0/include/c++/v1/type_traits:4573:22: note: in instantiation of template class ''std::__1::result_of<void (&(nullptr_t &&))(void *) noexcept>'' requested here template <class _Tp> using result_of_t = typename result_of<_Tp>::type; ^ /opt/wandbox/clang-6.0.0/include/c++/v1/functional:2349:1: note: in instantiation of template type alias ''result_of_t'' requested here result_of_t<_Fn&&(_Args&&...)> ^ prog.cc:9:3: note: while substituting deduced template arguments into function template ''invoke'' [with _Fn = void (&)(void *) noexcept, _Args = <nullptr_t>] std::invoke(std::forward<F>(f), std::forward<T>(v)); ^ prog.cc:16:3: note: in instantiation of function template specialization ''for_each<void (&)(void *) noexcept, nullptr_t>'' requested here for_each(func, nullptr); ^ 1 error generated.

Eliminar el especificador noexcept en func()

void func(void*) /* noexcept */ {}

Luego se compila. No entiendo esto ¿Es este un error de compilación?