Ответ 1
Оценка begin+2000
равна undefined, она проходит мимо конца массива - вы можете перейти к концу, но не дальше.
Из С++ 11 §5.7/5 Аддитивные операторы:
Когда выражение, которое имеет интегральный тип, добавляется или вычитается из указателя, результат имеет тип операнда указателя. Если операнд указателя указывает на элемент объекта массива, и массив достаточно велик, результат указывает на смещение элемента от исходного элемента, так что разность индексов результирующих и исходных элементов массива равна интегральному выражению. [...] Если оба операнда указателя и результат указывают на элементы одного и того же объекта массива или один за последним элементом объекта массива, оценка не должна приводить к переполнению; в противном случае, поведение undefined.
Для сопоставления указателей, которые должны быть указаны, если у вас есть действительные указатели для начала, они по существу должны быть указателями на один и тот же массив (или один за концом) или указатели на нестатические элементы данных одного и того же элемента управления доступом одного и того же объекта (если только это не объединение).
Подробности приведены в §5.9/2 Реляционные операторы:
Указатели на объекты или функции одного и того же типа (после конверсий указателей) можно сравнить с результатом, определяемым следующим образом:
- Если два указателя p и q того же типа указывают на один и тот же объект или функцию, или оба указывают одно прошлое конец одного и того же массива или оба являются нулевыми, то p <= q и p >= q оба дают true и p < q и p > q обе дают false.
- Если два указателя p и q того же типа указывают на разные объекты, которые не являются членами одного и того же объект или элементы одного и того же массива или разные функции или если только один из них является нулевым, результаты p < q, p > q, p <= q и p >= q не определены.
- Если два указателя указывают на нестатические элементы данных одного и того же объекта или на подобъекты или элементы массива таких элементов, рекурсивно, указатель на более поздний объявленный элемент сравнивается больше, если два члена имеют одинаковый контроль доступа (раздел 11) и при условии, что их класс не является объединением.
- Если два указателя указывают на нестатические элементы данных одного и того же объекта с различным контролем доступа (Пункт 11) результат не указан. - Если два указателя указывают на нестатические элементы данных одного и того же объекта объединения, они сравнивают равные (после преобразование в void *, если необходимо). Если два указателя указывают на элементы одного и того же массива или один за ним конец массива, указатель на объект с более высоким индексом сравнивается выше.
- Другие сравнения указателей не определены.