为什么嵌套数组对象无法提供存储?

Byt*_*ter 6 c++ arrays lifetime language-lawyer

在提供存储下的生命周期中,它说:

作为一种特殊情况,可以在 unsigned char 或 std::byte (C++17 起) 数组中创建对象(在这种情况下,据说数组为对象提供存储)如果

  • 数组的生命周期已经开始但尚未结束
  • 新对象的存储完全适合数组
  • 数组中没有满足这些嵌套约束的数组对象。

为什么会有第三个条件呢?

即使有一个嵌套数组(我相信这意味着一个从外部数组的某个索引开始并以不远的索引结束的数组,而不是一个作为外部数组的项目的数组,因为术语“嵌套”可能是大多数语言都可以理解),让与嵌套数组不相交的外部数组的一段来提供存储会给标准作者或实现带来什么困难?

而且,如果嵌套数组中没有嵌套任何数组,我是否正确理解它可以提供存储?如果是这样,为什么外部数组不能在同一位置提供存储,即提供存储的段不跨越任何嵌套(可能间接)数组的开头或结尾?

而且,即使跨接,该标准包含此要求以避免出现哪些问题?

另外,嵌套数组是否可以不满足第二个条件,即部分重叠?这样的数组可能存在吗?那么,在什么意义上、在什么条件下,一个嵌套在另一个中呢?两者可以相互嵌套吗?

Sto*_*ica 5

考虑这个例子(忽略对齐)

struct A { std::byte s2[64]; };
std::byte s1[128];
int* i1 = new(s1) int;
A* a = new(s1 + 32) A; // Create at some valid offest
int* i2 = new(a->s2) int;
Run Code Online (Sandbox Code Playgroud)

如果我们按照您带来的引用,则s1和 都a->s2满足关于i2我们创建的整数的第一个和第二个项目符号。a->s2然而,我认为我们都同意,将其识别为提供存储会更精确,因为它更紧密地包含我们的整数(同时为s1提供存储i1)。第三个项目符号正是这样做的,即它标识为对象提供存储的“最近”数组对象。

嵌套数组不能是“从某个索引开始”的数组,因为它根本不是一个数组。C++ 标准下的数组是具有特定类型的对象(大小信息已融入其中),并且移动起点或终点不会神奇地在该区域中创建和数组(从技术上讲,我们可以重新解释_转换该区域,但这很快就让我们追求未定义的行为,所以我不认为它与讨论相关)。