В проекте 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?