Почему в C ++ 17 изменилась спецификация цикла, основанная на диапазоне «для»? [Дубликат]

На этот вопрос уже есть ответ:

Я просматривал некрасивый код (который изменял основную последовательность во время итерации), и чтобы изучить определение цикла for, основанного на диапазоне, я перешел к cppreference .

Там я заметил кое-что странное:

Цикл for, основанный на диапазоне, изменился в C ++ 17, но я не вижу причины изменения, и код выглядит так же меня (просто "рефакторинг"). Итак, старый был:

{
  auto && __range = range_expression;
  for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {
    range_declaration = *__begin;
    loop_statement
  }
} 

Новый -

{
  auto && __range = range_expression;
  auto __begin = begin_expr;
  auto __end = end_expr;
  for ( ; __begin != __end; ++__begin) {
    range_declaration = *__begin;
    loop_statement
  }
} 

Почему было сделано это изменение, и заставляет ли оно какие-либо легальные программы на C ++ 14 демонстрировать неопределенное поведение ( UB ) в C ++ 17?

60
задан Peter Mortensen 4 October 2019 в 17:18
поделиться