https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121327
Patrick Palka <ppalka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|c++ |libstdc++ --- Comment #3 from Patrick Palka <ppalka at gcc dot gnu.org> --- Perhaps a more palatable workaround is to constrain the generic operator== to exclude types that are convertible to id (since the non-generic operator== will handle them): template <typename U> requires (!std::convertible_to<U, const id&>) && std::equality_comparable_with<T, U> constexpr bool operator==(const U& other) const { return m_id == other; } But yeah, I think we're behaving as specified... some concepts are just prone to accidental constraint recursion.