https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88545
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Jonathan Wakely from comment #2) > + using _ValT = typename iterator_traits<_InputIterator>::value_type; > + if constexpr (is_same_v<_ValT, _Tp>) > + if constexpr (__is_byte<_ValT>::__value) We can do better than this. We can use memchr to find a char in a range of signed char, or even to find an int in a range of signed char, as long as we're careful about values. For example, given s = "abc"sv, std::find(s.begin(). s.end(), 'a'+0) should find a match, but std::find(s.begin(), s.end(), 'a'+256) should not (even though memchr would match in that case, because it does (unsigned char)('a'+256)). We should also ensure that std::ranges::find gets the same optimizations.