"Модификация последовательностей в середине цикла довольно распространена"
Избегание подъема не сделает макрос невосприимчивым к проблемам модификации, поскольку BOOST_FOREACH также использует движущийся итератор под покрытиями, которые могут быть аннулированы push_back
(например, вы используете вектор, и он перераспределяет) или другие структурные изменения.Не стоит использовать новый действительный end
итератор, если то, что вы сравниваете с ним, больше не является действительным.
Мне кажется разумным предоставить что-то, что очевидно имеет проблемы со структурными изменениями.Подводный камень говорит: «Если это может привести к тому, что итераторы станут недействительными, не делайте этого. Вместо этого используйте регулярный цикл for». Без указания , итераторы должны оставаться действительными.Используйте цикл for, если ваши операции могут прервать любой итератор.
Если у иногда есть проблемы, в зависимости от характера изменений, это означает, что макрос будетдолжны документировать, какие модификации в порядке, а какие нет (если только описать скрытый итератор и сказать: «Не аннулируйте это, но вы можете сделать недействительными другие итераторы»), что начинает становиться неловким API.Из выборки одного пользователя 100% предположили, что это будет невосприимчиво, поэтому я не уверен, что это очень интуитивно понятный интерфейс.
Тем не менее, я думаю, что вы правы, что BOOST_FOREACH может легко гарантировать, что он толькосодержит (1) конечный итератор, плюс (2) итератор, указывающий на текущий итератор.Таким образом, если у вас была версия без лебедки, с (2), но не с (1), тогда все, что вам нужно сделать, это убедиться, что вы не аннулируете текущий итератор.Я не думаю, что он существует, однако, автор этой ловушки, похоже, считает, что конечный итератор является частью опасности аннулирования, вместо того, чтобы пытаться отделить различные виды аннулирования.Я думаю, что BOOST_FOREACH
был задуман как улучшенный синтаксис для std::for_each
по сравнению с Boost.Range и соответствует этой цели.Вы всегда можете предложить соответствующим людям Boost, что это может быть больше, чем это.