Предположим, что у нас есть массив, содержащий N элементов типа T.
T a[N];
Согласно стандарту С++ 14, при каких условиях у нас есть гарантия, что
(char*)(void*)&a[0] + n*sizeof(T) == (char*)(void*)&a[n], (0<=n<N) ?
Хотя это верно для многих типов и реализаций, стандарт упоминает его в сноске и двусмысленно:
§5.7.6, сноска 85) Еще один способ приблизиться к арифметике указателя...
Существует мало признаков того, что этот другой способ считался эквивалентным стандартным образом. Возможно, это будет намек для разработчиков, который предлагает одну из многих соответствующих реализаций.
Изменения:
Люди недооценили трудность этого вопроса.
Этот вопрос не о том, что вы можете прочитать в учебниках, а о том, что вы можете вывести из С++ 14 Standard с помощью логики и разума.
Если вы используете "смежный" или "смежный", пожалуйста, также скажите, что смежно.
В то время как T [] и T * тесно связаны, они являются абстракциями, а добавление на T * x N может быть определено реализацией любым последовательным способом.
Уравнение было перестроено с использованием добавления указателя. Если p указывает на a char, p + 1 всегда определяется с помощью (§5.7 (4)) или унарного сложения, поэтому мы не сталкиваемся с UB. Оригинал включал вычитание указателя, которое могло вызвать UB на ранней стадии. (Указатели char сравниваются, а не разыменовываются).