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指针只进行比较,而不是解除引用).
在[dcl.array]中:
数组类型的对象包含连续分配的非空
N类型的子对象T.
连续意味着任何类型的连续子对象之间的偏移T是sizeof(T),这意味着第二n个子对象的偏移是n*sizeof(T).
上限n < N来自[expr.add]:
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型.如果表达式
P指向具有元素x[i]的数组对象x的n元素,则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x[i + j]if0 <= i + j < n; 否则,行为未定义.
| 归档时间: |
|
| 查看次数: |
697 次 |
| 最近记录: |