Что означает "нет меньшего объекта массива, который удовлетворяет этим ограничениям"?
В проекте 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?
Ответы
Ответ 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
.