std::invoke wrongly takes the partial specialization for objects instead for functions for functions marked with noexcept. I'm on r331914. #include <functional> void func() noexcept {} int main() { std::invoke(func); } Here's the full error message: In file included from main.cpp:1: In file included from /usr/local/bin/../include/c++/v1/functional:484: /usr/local/bin/../include/c++/v1/type_traits:4196:19: error: invalid application of 'sizeof' to a function type static_assert(sizeof(_Tp) > 0, Type must be complete.); ^~~~~~~~~~~ /usr/local/bin/../include/c++/v1/type_traits:4201:15: note: in instantiation of template class 'std::__1::__check_complete<void () noexcept>' requested here : private __check_complete<_Tp> ^ /usr/local/bin/../include/c++/v1/type_traits:4494:15: note: in instantiation of template class 'std::__1::__check_complete<void (&)() noexcept>' requested here : private __check_complete<_Fp> ^ /usr/local/bin/../include/c++/v1/type_traits:4557:9: note: in instantiation of template class 'std::__1::__invokable_r<void, void (&)() noexcept>' requested here __invokable<_Fp, _Args...>::value, ^ /usr/local/bin/../include/c++/v1/type_traits:4566:14: note: in instantiation of template class 'std::__1::__invoke_of<void (&)() noexcept>' requested here : public __invoke_of<_Fp, _Args...> ^ /usr/local/bin/../include/c++/v1/type_traits:4571:22: note: in instantiation of template class 'std::__1::result_of<void (&())() noexcept>' requested here template <class _Tp> using result_of_t = typename result_of<_Tp>::type; ^ /usr/local/bin/../include/c++/v1/functional:2346:1: note: in instantiation of template type alias 'result_of_t' requested here result_of_t<_Fn&&(_Args&&...)> ^ main.cpp:5:14: note: while substituting deduced template arguments into function template 'invoke' [with _Fn = void (&)() noexcept, _Args = <>] int main() { std::invoke(func); } ^ 1 error generated.
It seems we don't have a proper specialization of __check_complete for noexcept function types.
Fixed in r332040 and r332066. We no longer check for the completeness of types to `invoke` or similar callable traits. We probably should, but doing it correctly is super expensive, in terms of both compile time and compiler memory usage.