https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103923
Bug ID: 103923 Summary: is_invocable<const T &, ...> inexplicably fails Product: gcc Version: 11.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jengelh at inai dot de Target Milestone: --- Input: #include <cstdio> #include <typeinfo> #include <type_traits> #include <unordered_map> struct T { struct K { bool operator==(const K &) const { return 0; } bool operator<(const K &) const { return 0; } }; struct H { auto operator()(const K &) const { return 0; } }; std::unordered_map<T::K, int, T::H> m; }; int main() { printf("%d\n", std::is_invocable_v<const T::H &, const T::K &>); printf("%d\n", std::is_invocable_v<T::H, const T::K &>); //T().m[T::K()]; // for extra fun } Output: GNU C++17 (SUSE Linux) version 11.2.1 20211124 [revision 7510c23c1ec53aa4a62705f0384079661342ff7b] (x86_64-suse-linux) compiled by GNU C version 11.2.1 20211124 [revision 7510c23c1ec53aa4a62705f0384079661342ff7b], GMP version 6.2.1, MPFR version 4.1.0-p7, MPC version 1.2.1, isl version isl-0.24-GMP 0 1 Expected output: 1 1 Expectation based on it being possible to invoke on a const H &: { T::H h; const T::H &hh = h; hh(T::K()); }