Проходят ли разыменованные итераторы мимо «одного за другим» итератора с неопределенным поведением массива?

Даноint foo[] = {0, 1, 2, 3}; Я хочу знать, недействительны ли итераторы, которые указывают за «один конец». Например:auto bar = cend(foo) + 1;

Существует множество жалоб и предупреждений о том, что это «неопределенное поведение» в вопросах переполнения стека:c ++, что является результатом итератора + целое число при прошлом итераторе? К сожалению, единственный источник - это махание рукой.

У меня все больше проблем с покупкой, например:

int* bar;

Неинициализирован, но, конечно, не вызывает неопределенного поведения, и при достаточном количестве попыток я уверен, что смогу найти экземпляр, в котором значение в этом неинициализированномbar имел то же значение, что иcend(foo) + 1.

Одно из самых больших заблуждений заключается в том, что яне спрашивать о разыменованииcend(foo) + 1. Я знаю, что это будет неопределенным поведением, и стандарт запрещает это. Но ответы, как это:https://stackoverflow.com/a/33675281/2642059 которые ссылаются только на то, что разыменование такого итератора является незаконным делатьне Ответ на вопрос.

Я также знаю, что C ++ только гарантирует, чтоcend(foo) будет действительным, но это может бытьnumeric_limits<int*>::max(), в таком случаеcend(foo) + 1 будет переполнен. Я не заинтересован в этом случае, если в стандарте он не назван как причина, по которой у нас не может быть итератора, прошедшего «один за другим». я знаю этоint* на самом деле просто содержит целочисленное значение и как таковое может быть переполнено.

Я хотел бы привести цитату из достоверного источника о том, что перемещение итератора за пределы элемента «один конец» является неопределенным поведением.

Ответы на вопрос(4)

Ваш ответ на вопрос