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

时间:2018-01-03 10:02:23

标签: c++ language-lawyer c++17

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

  

3如果在与“n的数组”类型的另一个对象e相关联的存储中创建完整对象(8.3.4)   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在16字节数组中仅使用4个字节(假设sizeof(int)为4)。那么,3.3的含义是什么?

1 个答案:

答案 0 :(得分:9)

3.3的含义是将a[32]b[16]区分开来。前者不为*p提供存储,因为后者确实存在。它标识最小的唯一数组对象,该对象提供对象所在的存储区域。

如果没有3.3,定义将是可传递的。 a[32]会为*p提供存储空间,因为它最终会为b[16]提供存储空间。

关于使用4个字节的*p。重要的是要注意区域[b->b + 4, b->b +8)虽然是*p所在的存储区,但不是提供存储区的数组对象(该区域根本不是数组对象)。最小的数组对象是b->b