@ Олив: Нет, я не говорил, что это неопределенное поведение. Это адрес члена массива, а арифметические правила указателя позволяют добавлять любое смещение, попадающее в тот же массив. Что определяет ваш пример.
те рассмотрим этот код:
int i;
int is[10]{};
unsigned char * p = reinterpret_cast<unsigned char*>(&i);
//p defined to point to the object-representation of the first element of array ints
unsigned char * ps = reinterpret_cast<unsigned char*>(&is[0]);
p += sizeof(int);
ps += sizeof(int);
//now ps points to the end of ints[0] and p point to the end of i;
p += sizeof(int); //Undefined behavior according to [expr.add]
ps += sizeof(int); //Undefined behavior?
unsigned char c = *ps;//Undefined behavior?
Если мы посмотрим, чтоps
указывает наобъект-представление изis[0]
затем в соответствии с арифметическим правилом указателя поведение не определено в двух последних строках кода.
Тем не менее, еслиps
также указатель наобъект-представление массива intis
поведение определено.
Итак, мой вопрос: указатель наобъект-представление изsuboject также указатель на элементобъект-представление содержащего завершенного объекта?