"没有更小的数组对象满足这些约束"是什么意思?

Ser*_*sta 11 c++ language-lawyer c++17

用于C++ 17的n4659草案描述了第4章中语言的一般原理.在第4.5章,C++对象模型[intro.object]中,我无法理解一个句子的含义(强调我的)

3如果在与"N unsigned char数组"类型或"n std :: byte数组"(21.2.1)类型的另一个对象e关联的存储中创建了一个完整对象(8.3.4),该数组提供存储对于创建的对象if:
(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
Run Code Online (Sandbox Code Playgroud)

这里*p只使用sizeof(int)16字节数组中的4个字节(假设为4).那么,3.3的含义是什么?

Sto*_*ica 9

如果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.