非数组对象类型的单末尾指针可以吗?

Ayx*_*xan 4 c++ pointers language-lawyer

这是有效的C ++吗?

int main()
{
    int i = 0;
    int* pi = &i;
    ++pi;
}
Run Code Online (Sandbox Code Playgroud)

我知道数组类型允许使用单末尾指针,但是在这种情况下我不确定。从技术上讲,该代码是否具有未定义的行为?

Sto*_*ica 7

是的,没关系。它是任何指针类型都可以保存的四类值之一。

[basic.compound](重点是我的)

3指针类型的每个值都是以下之一:

  • 指向对象或函数的指针(据说该指针指向对象或函数),或
  • 一个超出对象末尾的指针([expr.add]),或
  • 该类型的空指针值([conv.ptr]),或者
  • 无效的指针值。

指向或超过对象末尾的指针类型的值表示该对象所占内存中第一个字节([intro.memory])的地址或存储结束后内存中的第一个字节的地址被对象分别占据。[注意:超出对象末尾的指针([expr.add])不会被认为指向可能位于该地址的对象类型的不相关对象。当指针值表示的存储到达存储持续时间的结尾时,该指针值将变为无效;参见[basic.stc]。—结尾说明] 用于指针算术 ([expr.add])和比较([expr.rel],[expr.eq]),超过n个元素的数组x的最后一个元素的末尾的指针被视为等效于x的假设数组元素和一个对象的指针。不是数组元素的类型T被认为属于具有一个类型T元素的数组。

如您所见,这里还提到了数组类型,其假设对象超出了最后。而作为在[expr.add]脚注解释的那样,算术获得一个过去的最末端指针到有效过:

如[basic.compound]中所指定,出于此目的,不是数组元素的对象被视为属于单元素数组,并且经过n个元素数组的最后一个元素的指针被视为等效于为此目的指向虚拟数组元素n的指针。

  • @abhiarora如果我没有记错。“当指针值表示的存储达到其存储持续时间的结尾时,该指针值将变为无效”。这里的语言是在谈论诸如悬空指针之类的情况 (2认同)