Учитывая int foo[] = {0, 1, 2, 3};
, я хочу знать, являются ли итераторы, указывающие минус "один конец", недопустимыми. Например: auto bar = cend(foo) + 1;
Существует множество жалоб и предупреждений о том, что это "поведение w90" в Stack Вопросы переполнения: С++, что является результатом итератора + целого числа, когда прошлое -iterator? К сожалению, единственным источником является размахивание руки.
У меня больше проблем с покупкой, например:
int* bar;
Не инициализирован, но, конечно, не вызывает поведение undefined, и при достаточном количестве попыток я уверен, что могу найти экземпляр, где значение в этом неинициализированном bar
имеет то же значение, что и cend(foo) + 1
.
Одно из больших недоразумений заключается в том, что я не спрашиваю о разыменовании cend(foo) + 1
. Я знаю, что это будет поведение undefined, и стандарт запрещает его.. Но отвечает вот так: qaru.site/info/4272/..., в которых приводятся только разыменование таких итератор является незаконным, не отвечайте на вопрос.
Я также знаю, что С++ гарантирует, что cend(foo)
будет действительным, но может быть numeric_limits<int*>::max()
, и в этом случае cend(foo) + 1
будет переполняться. Меня не интересует этот случай, если он не вызван в стандарте как причина, по которой мы не можем иметь итератор мимо "одного конца". Я знаю, что int*
действительно просто хранит целочисленное значение и как таковое подвержено переполнению.
Я хотел бы получить цитату из достоверного источника, что перемещение итератора за пределы элемента "один конец" означает undefined.