Проходят ли разыменованные итераторы мимо «одного за другим» итератора с неопределенным поведением массива?
Дано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*
на самом деле просто содержит целочисленное значение и как таковое может быть переполнено.
Я хотел бы привести цитату из достоверного источника о том, что перемещение итератора за пределы элемента «один конец» является неопределенным поведением.