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()); }

Reply via email to