@antoshkka тут есть забавное мнение, что надо убрать ограничение signed на iterator_traits<X> :: difference_type
потому что это на самом деле distance_type, и для input_iterator он беззнаковый (он становится знаковым только на bidirectional, и требование signed должно быть указано для bidirectional)