Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是;没有更小的数组对象满足这些约束;什么意思?_C++_Language Lawyer_C++17 - Fatal编程技术网

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

C++ 什么是;没有更小的数组对象满足这些约束;什么意思?,c++,language-lawyer,c++17,C++,Language Lawyer,C++17,针对C++17的n4659草案在第4章中描述了该语言的一般原理。在第4.5章中,C++对象模型[ION.Object ],我不能理解一个句子的意义(强调地雷) 3如果在与另一个“N的数组”类型的对象e关联的存储器中创建了完整的对象(8.3.4) “unsigned char”或类型为“array of N std::byte”(21.2.1),该数组为创建的 对象如果: (3.1)-e的寿命已经开始,而不是结束,并且 (3.2)-新对象的存储完全适合e,并且 (3.3)没有更小的数组对象满足这些

针对C++17的n4659草案在第4章中描述了该语言的一般原理。在第4.5章中,C++对象模型[ION.Object ],我不能理解一个句子的意义(强调地雷)

3如果在与另一个“N的数组”类型的对象e关联的存储器中创建了完整的对象(8.3.4) “unsigned char”或类型为“array of 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的含义是什么呢?

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

我的未知猜测。您可以在较大的字符数组中放置一个字符数组,在较小的字符数组中放置另一个对象。较小的数组将为另一个对象提供存储。