"没有满足这些约束的较小数组对象"是什么意思?
What does "there is no smaller array object that satisfies these constraints" mean?
C++17的n4659草案在第4章中描述了该语言的一般原则。在第 4.5 章,C++对象模型 [intro.object] 中,我无法理解一句话的含义(强调我的(
3 如果在与另一个对象 e 相关联的存储中创建完整对象 (8.3.4(,类型为 "N 的数组" 无符号字符"或类型为"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
.
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 将 int 数组转换为带有小数C++的双精度数组
- 如何将大括号初始值设定项用于动态大小数组和新数组?
- 对未知大小数组的引用的列表初始化:它是否应该推断数组大小?
- 返回指向固定大小数组C++的数组的指针
- 如何将小数数组转换为二进制数数组
- 对指向固定大小数组的指针数组的内存分配的解释
- 在 C++ 中创建固定大小的 int 数组的动态大小数组