Ответ 1
Нет, это законно. 5.7 (4) - один абзац перед вашей цитатой - говорит: "Для целей этих операторов указатель на объект nonarray ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта как его тип элемента. "
В стандарте С++ [с 5.7] говорится:
Если оба операнда указателя и результат указывают на элементы одного и того же объекта массива или одно прошлое последний элемент объекта массива, оценка не должна приводить к переполнению; в противном случае поведение undefined.
Итак, могу ли я исходить из предположения, что указатели одного конца прошлого типа, кроме массивов, undefined?
Например:
int a = 0;
vector<int> v(&a, (&a)+1);
Вышеприведенный фрагмент компилируется и работает просто отлично (с g++), но действительно ли он?
Нет, это законно. 5.7 (4) - один абзац перед вашей цитатой - говорит: "Для целей этих операторов указатель на объект nonarray ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта как его тип элемента. "