https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93059
--- Comment #4 from fdlbxtqi <euloanty at live dot com> --- A demo fix would be like this i think: template<std::input_iterator input_iter,std::input_iterator output_iter> inline constexpr output_iter my_copy_n(input_iter first,std::size_t count,output_iter result) { using input_value_type = typename std::iterator_traits<input_iter>::value_type; using output_value_type = typename std::iterator_traits<output_iter>::value_type; if constexpr (std::contiguous_iterator<input_iter>&& std::contiguous_iterator<output_iter>&& std::is_trivially_copyable_v<input_value_type>&& std::is_trivially_copyable_v<output_value_type>&& (std::same_as<input_value_type,output_value_type>||(std::integral<input_value_type>&& std::integral<output_value_type>&&sizeof(std::is_trivially_copyable_v<input_value_type>)==sizeof(std::is_trivially_copyable_v<output_value_type>)))) { if (std::is_constant_evaluated()) { for(;count--;) { *result=*first; ++first; ++result; } } else __builtin_memmove(std::to_address(result),std::to_address(first), sizeof(typename std::iterator_traits<input_iter>::value_type)*count); return result+count; } return std::copy_n(first,count,result); }