@ Олив: Нет, я не говорил, что это неопределенное поведение. Это адрес члена массива, а арифметические правила указателя позволяют добавлять любое смещение, попадающее в тот же массив. Что определяет ваш пример.

те рассмотрим этот код:

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 также указатель на элементобъект-представление содержащего завершенного объекта?

 StoryTeller13 окт. 2017 г., 23:56
Вы спрашиваете, используете ли выoffsetof а указатель арифметики с символьными типами хорошо определен?
 Oliv13 окт. 2017 г., 23:54
@BenVoigt Если вы перейдете по ссылке «suboject», вы получите: «Субобъект может быть подобъектом-членом ([class.mem]), подобъектом базового класса ([class.derived]) или элементом массива».
 Ben Voigt13 окт. 2017 г., 23:52
Я думаю, что вы путаете «подобъект» с «членом массива». Для подобъектов-членов сравнение между указателями внутри одного и того же большого объекта разрешено, а арифметика - нет. Для указателей на элементы массива можно использовать арифметику указателей.
 Oliv13 окт. 2017 г., 23:56
@BenVoigt Я знаю правило об арифметике указателей. Здесь вопрос об арифметике указателей на объект-представление
 Oliv14 окт. 2017 г., 00:06
@RichardCritten У меня были сомнения по этому поводу, но, очевидно, концепция представления объектов тесно связана с концепцией хранения. Здесь вопрос, который я задал, с причинами, по которым у меня были сомнения в комментариях, моя проблема была в действительности, является ли значение указателя действительным или нет? Видимо это так.stackoverflow.com/questions/46735324/...

Ответы на вопрос(2)

азатель, который содержит адрес объекта, и этот указатель может быть получен безопасно или небезопасно.

«Представление объекта» вступает в игру, когда вы читаете в пределах диапазона адресов объекта, используя l-значение узкого символьного типа, а не когда указатель сформирован или преобразован.

Ничего в правилах дляreinterpret_cast<unsigned char*>(p) говорит что-нибудь о результате, являющемся специальным «указателем на представление объекта». Это еще один псевдоним для того же объекта.

 Oliv14 окт. 2017 г., 09:22
Просто комментарий, я думаю, что [basic.stc.dynamic.safety] здесь не применяется, потому что мы не имеем дело с указателем, выделеннымnew и, как бы то ни было, все реализации имеютспокойная безопасность указателя.
 Oliv14 окт. 2017 г., 09:21
Спасибо. Так ты имеешь в виду, чтоauto ps = reinterpret_cast<unsigned char*> (&is[0]) псевдоним для первого элемента массиваis так чтоps+2*sizeof(int) неопределенное поведение, даже если память указанаps+2*sizeof(int) находится внутриisдиапазон адресов?
 Ben Voigt15 окт. 2017 г., 03:34
@ Олив: Нет, я не говорил, что это неопределенное поведение. Это адрес члена массива, а арифметические правила указателя позволяют добавлять любое смещение, попадающее в тот же массив. Что определяет ваш пример.
Решение Вопроса

Общий случай

Да, указатель на объект-представление подобъекта также является указателем начасть объект-представление содержащего завершенного объекта.

Это может быть выведено из:

1,8 / 1: Объект - это область хранения.

3,9 / 4: Объектное представление объекта типа T - это последовательность из N беззнаковых объектов char, занятых объектом типа T, где N равно sizeof (T).

5.3.3 / 1: Оператор sizeof возвращает количество байтов в объектном представлении своего операнда.

1.8 / 2: Объекты могутсодержать другие объекты, называемые подобъектами. Подобъект может быть подобъектом-членом, подобъектом базового класса или элементом массива. Объект, который не является подобъектом любого другого объекта, называется законченным объектом.

Тот факт, что объект является областью хранения и что подобъект содержится в области хранения, означает, что представление подобъекта содержится в представлении объекта.

Как объяснено вэтот другой ответуказатель на представление объекта фактически является указателем на объект.

Особый случай массива

Да, указатель на представление объекта подобъекта (т.е. в данном случае элемент массива) является указателем наэлемент объект-представление содержащего завершенного объекта (т.е. в данном случае массива).

8.4.3 / 1: (...) Объект типа массив содержитпо соседству выделено непустое множество из N подобъектов типа T. (...)

Итак, по определению:

элементы массива расположены непрерывно, что означает, что между элементами нет пустого пространства.

объектное представление каждого элемента представляет собой последовательность беззнаковых символов размера sizeof (T), а объектное представление полного массива представляет собой беззнаковые символы без знака N * sizeof (T).

Затем мы можем вывести:

Как объяснено вэтот другой ответуказатель на представление объекта фактически является указателем на объект.

адрес k-го элемента в массиве соответствует k-му элементу в объектном представлении массива и по построению имеет смещение k * sizeof (T) беззнаковых символов адреса представления массива.

Таким образом, последние 2 утверждения вашего кода не являются неопределенным поведением, если вы остаетесь в пределах границis

Ваш ответ на вопрос