https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92849
--- Comment #1 from Alexander Kondratskiy <kholdstare0.0 at gmail dot com> --- Actually, this might be bogus. If I do an explicit `using`, everything works: #include <type_traits> template <typename Signature> struct declfunc; template <typename Result, typename... Args> struct declfunc<Result(Args...)> { Result operator() (Args...); }; template <typename... Signatures> struct decloverload : declfunc<Signatures>... { using declfunc<Signatures>::operator()...; }; using overload_set = decloverload<void(int), void(int, int)>; static_assert(std::is_invocable_v<overload_set, int>); Godbolt link: https://godbolt.org/z/VJwPV4