Следует ли избегать преобразований из неконстантного итератора в константный итератор? - PullRequest
0 голосов
/ 25 октября 2018

Я пытался сравнить const iterator с non-const iterator, но не был уверен, все ли в порядке, поэтому я посмотрел его.Я обнаружил, что все в порядке из-за неявного преобразования non-const iterator в const iterator.Однако мне было интересно, стоит ли вам предпочитать не сравнивать эти итераторы, чтобы избежать этого преобразования.Например,

begin_iterator = buf.begin();  end_iterator = buf.cend();
for (; begin_iterator != end_iterator; ++begin_iterator) { ... }

Регулярно я бы рассматривал это ОК как const, означающее только чтение, и это нормально.Однако я не уверен насчет (ненужного) преобразования.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Хотя это может работать в этом случае, это не стандартный шаблон для создания диапазонов.В частности, стандартные алгоритмы ожидают двух итераторов одного типа, поэтому, например, 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);

, но это не компилируется, поэтому сопровождающему приходится искать и обнаруживать, что два итератора не одного типа, а затем выяснить,можно ли изменить тип конечного итератора, чтобы он соответствовал начальному итератору.Это означает, что нужно изучить все места, где используется конечный итератор, чтобы определить, почему это другой тип и имеет ли это значение.

Таким образом, реальная проблема заключается в том, какую проблему это решает, и стоит ли это затрат??В общем случае ответ на первый вопрос - «ничего важного», а ответ на второй - «нет».

0 голосов
/ 25 октября 2018

Всегда хорошо преобразовать неконстантный итератор в константный итератор, так же, как это хорошо, если преобразовать неконстантный указатель в константный указатель.

Обратное не то, что вы хотите сделать,привести к сбою (например, потому что данные хранятся только в постоянном пространстве).Так что никогда не делай этого.

...