Подтвердить что ты не робот

Что означает "нет меньшего объекта массива, который удовлетворяет этим ограничениям"?

В проекте n4659 для С++ 17 описаны общие принципы языка в главе 4. В главе 4.5, объектная модель С++ [intro.object], я не могу понять значение одного предложения (подчеркивайте мое)

3 Если создается полный объект (8.3.4) в хранилище, связанный с другим объектом e типа "массив из N unsigned char" или массива типа N std:: byte (21.2.1), этот массив предоставляет хранилище для созданного объект, если:
(3.1) - время жизни e началось и не закончилось, и
(3.2) - хранение нового объекта полностью соответствует e, и
(3.3) - нет объекта меньшего массива, который удовлетворяет этим ограничениям.

в то время как примеры показывают, что массив может обеспечить хранение элементов намного короче, чем массив:

struct A { unsigned char a[32]; };
struct B { unsigned char b[16]; };
A a;
B *b = new (a.a + 8) B; // a.a provides storage for *b
int *p = new (b->b + 4) int; // b->b provides storage for *p

здесь *p используется только 4 байта (при условии, что sizeof(int) равно 4) в массиве 16 байтов. Итак, в чем смысл 3.3?

4b9b3361

Ответ 1

Значение 3.3 означает дифференцировать a[32] с b[16]. Первый не обеспечивает хранение для *p, потому что последнее делает. Он идентифицирует наименьший уникальный объект массива, который предоставляет область хранения, в которой находится объект.

Без 3.3 определение будет транзитивным. a[32] обеспечит хранение для *p, потому что в конечном итоге он обеспечивает хранение для b[16].


Относительно *p с использованием 4 байтов. Важно отметить, что область [b->b + 4, b->b +8), будучи хранилищем, где находится *p, не является объектом массива, предоставляющим хранилище (эта область вообще не является объектом массива). Этот наименьший объект массива будет b->b.