【发布时间】:2020-04-18 21:29:05
【问题描述】:
我的印象是,虽然取消引用不指向有效对象的指针是 UB,但简单地计算这样的指针就可以了。
但是,如果我对 expr.add[4] 的理解正确,则情况并非如此。
那么这些指针计算中哪些是明确定义的?
int a = 42;
int *p = &a;
p; // valid, and obviously ok
p++; // invalid, but ok, because one past the end of 'array' containing 1 element?
p++; // UB ?
这个案子怎么样?
int *p = nullptr;
p; // invalid, and obviously ok (considered one past the end?)
p++; // one past the end? or UB?
【问题讨论】:
-
在有效指针之外,唯一允许的 2 个指针是空指针和 1 个超出数组结尾。您的链接部分似乎清楚地总结了它?
-
@rustyx 对于第一种情况来说已经足够清楚了,我认为。不过我不确定第二种情况。
-
@rustyx 查看链接页面底部的注释 (76)
-
@RichardCritten 这就是我对第一个
p++的推理。这不适用于第三种情况吗? -
你称之为“无效”的两种情况都是有效的。 Past-the-end 和空指针是有效指针。 (参见 [basic.compound]/3)
标签: c++ pointers language-lawyer