Хотя это может работать в этом случае, это не стандартный шаблон для создания диапазонов.В частности, стандартные алгоритмы ожидают двух итераторов одного типа, поэтому, например, std::fill(whatever.begin(), whatever.cend(), 3)
не будет компилироваться.
В результате код в вопросе создает проблему обслуживания.Предположим, сопровождающий понимает, что цикл for делает что-то, что можно сделать стандартным алгоритмом.Очевидное преобразование заключается в замене цикла for алгоритмом.Так что
begin_iterator = buf.begin(); end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }
становится
begin_iterator = buf.begin(); end_iterator = buf.cend();
std::whatever(begin_iterator, end_iterator);
, но это не компилируется, поэтому сопровождающему приходится искать и обнаруживать, что два итератора не одного типа, а затем выяснить,можно ли изменить тип конечного итератора, чтобы он соответствовал начальному итератору.Это означает, что нужно изучить все места, где используется конечный итератор, чтобы определить, почему это другой тип и имеет ли это значение.
Таким образом, реальная проблема заключается в том, какую проблему это решает, и стоит ли это затрат??В общем случае ответ на первый вопрос - «ничего важного», а ответ на второй - «нет».