Может ли итератор с произвольным доступом заканчивать с увеличением на ноль?

В названии говорится, что все действительно. Учитывая, что итератор заканчивается, может ли он быть увеличен на ноль без вызова undefined поведения?

Дело в точке - работает ли следующий код для возврата итератора к указанному индексу - или к end, если индекс вне диапазона?

std::vector<Type>::iterator Class::fromIndex(size_t index) {
    return member_vector.begin() + std::min(index, member_vector.size());
}

Если поведение для std::advance или std::next отличается тем, что было бы интересно узнать, но здесь меня особенно интересует operator+.

Ответ 1

Это четко определенный no-op, скажем, я.

Учитывая, что итератор заканчивается, может ли он быть увеличен на ноль без вызова поведения undefined? [..] Меня интересует конкретно оператор +.

Для итераторов с произвольным доступом в таблице 115 в разделе [random.access.iterators] указывается (в разделе "Операционная семантика" и после "расширения" значения этого цикла while), что (r += 0) ≡ r, поэтому (.end() += 0) ≡ .end().

Определение для r + 0 дается в терминах этого.

Если поведение для std::advance или std::next отличается от того, что было бы интересно узнать.

Для всего остального std::next определяется в терминах std::advance, который в [iterator.operations] явно не говорит о том, что это хорошо определено, но это кажется довольно очевидным из формулировки, которая отступает от англо- определение языка для "increment" / "декремент": "Приращение (или уменьшение для отрицательного n) ссылки итератора i на n".

Мы знаем, что англоязычный "приращение" / "декремент" на ноль является практически не применимым.