Pas*_* By 12 c++ language-lawyer
尽我所能,我见过的最接近的答案就是这个,有两个完全相反的答案(!)
问题很简单,这是合法的吗?
auto p = reinterpret_cast<int*>(0xbadface);
*p; // legal?
Run Code Online (Sandbox Code Playgroud)
我对此事的看法
*p是一个废弃的值表达式所以我得出结论,没有明确说明这是未定义的行为.然而,我清楚地记得一些平台陷入间接无效指针.我的推理出了什么问题?
指针类型的每个值都是以下之一:
- 指向对象或函数的指针(指针指向对象或函数),或
- 指针超过对象的末尾([expr.add]),或
- 该类型的空指针值([conv.ptr]),或
- 无效的指针值.
通过消除过程,我们可以推断出这p是一个无效的指针值.
通过无效指针值间接并将无效指针值传递给释放函数具有未定义的行为.无效指针值的任何其他使用都具有实现定义的行为.
由于间接运算符被称为[expr.unary.op]执行间接,我想说,*p无论结果是否被使用,该表达式都会导致UB.