
[英]Treating a single object like an array with one element, taking one-past-end pointer
[英]Is one-past-end pointer OK for non-array object types?
这是有效的 C++ 吗?
int main()
{
int i = 0;
int* pi = &i;
++pi;
}
我知道数组类型允许使用过去式指针,但在这种情况下我不确定。 该代码在技术上是否具有未定义的行为?
是的,没关系。 它是任何指针类型可以保存的四类值之一。
[basic.compound] (强调我的)
3指针类型的每个值都是以下之一:
- 指向对象或函数的指针(该指针被称为指向该对象或函数),或
- 超过对象末尾的指针 ([expr.add]),或
- 该类型的空指针值 ([conv.ptr]),或
- 无效的指针值。
指向或越过对象末尾的指针类型的值表示该对象占用的内存([intro.memory])中的第一个字节或存储结束后的内存中的第一个字节的地址分别被对象占用。 [ 注意:超过对象结尾的指针 ([expr.add]) 不被认为指向可能位于该地址的对象类型的无关对象。 指针值在它所表示的存储到达其存储持续时间的末尾时变为无效; 参见 [basic.stc]。 — 尾注 ]出于指针算术([expr.add])和比较([expr.rel], [expr.eq]) 的目的,考虑超过 n 个元素的数组 x 的最后一个元素末尾的指针等价于指向 x 的假设数组元素 n 的指针和不是数组元素的类型 T 的对象被认为属于具有一个类型 T 的元素的数组。
如您所见,这里也提到了数组类型,其假设对象在末尾。 而作为在[expr.add]脚注解释的那样,算术获得一个过去的最末端指针,就是要有效得:
正如 [basic.compound] 中所指定的那样,一个不是数组元素的对象被认为属于这个目的的单元素数组,并且一个指针经过一个包含 n 个元素的数组的最后一个元素被认为等价于一个为此,指向一个假设的数组元素 n 的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.