T*与char*指针算法

Hei*_*och 11 c++ arrays pointers language-lawyer c++14

假设我们有一个包含N个T类型元素的数组.

T a[N];
Run Code Online (Sandbox Code Playgroud)

根据C++ 14标准,我们在哪些条件下有保证

 (char*)(void*)&a[0] + n*sizeof(T) == (char*)(void*)&a[n],  (0<=n<N) ?
Run Code Online (Sandbox Code Playgroud)

虽然对于许多类型和实现都是如此,但标准在脚注中以一种模糊的方式提到它:

§5.7.6,脚注85)另一种接近指针算法的方法......

几乎没有迹象表明这种方式被认为等同于标准的方式.对于实施者来说,这可能是一个提示,它暗示了许多符合要求的实现之一.


编辑:

人们低估了这个问题的难度.

这个问题不是关于你在教科书中可以阅读的内容,而是关于你可以通过使用逻辑和理由从C++ 14标准中推断出什么.

如果你使用'连续'或'连续',请说出什么是连续的.

虽然T []和T*密切相关,但它们是抽象,并且T*x N的加法可以通过任何一致的方式实现来定义.

使用指针添加重新排列等式.如果p指向char,则总是使用(§5.7(4))或一元加法定义p + 1,因此我们不会遇到UB.原始包括指针减法,这可能早期导致UB.(char指针只进行比较,而不是解除引用).

Bar*_*rry 7

在[dcl.array]中:

数组类型的对象包含连续分配的非空N类型的子对象T.

连续意味着任何类型的连续子对象之间的偏移Tsizeof(T),这意味着第二n个子对象的偏移是n*sizeof(T).

上限n < N来自[expr.add]:

当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型.如果表达式P指向具有元素x[i]的数组对象xn元素,则表达式P + JJ + P(其中J具有值j)指向(可能是假设的)元素x[i + j]if 0 <= i + j < n; 否则,行为未定义.