https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111281
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Frank Heckenbach from comment #4) > template <typename T> concept IsFunction = std::is_function_v <T> || > (std::is_pointer_v <T> && std::is_function_v <std::remove_pointer_t<T>>); remove_pointer is a no-op for non-pointers so you'll get the same result with: template <typename T> concept IsFunction = std::is_function_v <std::remove_pointer_t<T>>);