https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113960
--- Comment #6 from Stefan Schulze Frielinghaus <stefansf at linux dot ibm.com> --- Guard __is_byte_iter checks for contiguous bytes which I guess is fine for std::vector and then checks for __is_memcmp_ordered which is fine for big-endian targets in conjunction with unsigned integers. From cpp_type_traits.h we have: // Whether memcmp can be used to determine ordering for a type // e.g. in std::lexicographical_compare or three-way comparisons. // True for unsigned integer-like types where comparing each byte in turn // as an unsigned char yields the right result. This is true for all // unsigned integers on big endian targets, but only unsigned narrow // character types (and std::byte) on little endian targets. template<typename _Tp, bool _TreatAsBytes = #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ __is_integer<_Tp>::__value #else __is_byte<_Tp>::__value #endif Thus using memcmp here is fine, however, I'm still a bit unsure whether we really have to take the minimum of *__first1 and *__first2 since I haven't found any size-relation between those types.