【发布时间】:2018-04-23 23:44:51
【问题描述】:
尽我所能,我见过的最接近的答案是this,有两个完全相反的答案(!)
问题很简单,这样合法吗?
auto p = reinterpret_cast<int*>(0xbadface);
*p; // legal?
我对此事的看法
- Casting integer to pointer: 对可以投射的内容没有限制
- Indirection:只声明结果是左值。
- Lifetimes: 只说明对象不能做的事情,这里没有对象
-
Expression statements:
*p是一个废弃的值表达式 - Discarded value expressions:没有发生左值到右值的转换
- Undefined-ness of lvalues: 也就是严格的别名规则,仅当左值被转换为右值时
所以我得出的结论是,没有什么明确说这是未定义的行为。然而,我清楚地记得,一些平台会为无效指针设置间接陷阱。我的推理出了什么问题?
【问题讨论】:
-
你真的认为这合法吗?
-
@Passer “它可能产生副作用的唯一方法是如果它是 UB ...” 你抓住了我的想法 :-)
-
来自标准:“结果是一个左值,指的是表达式指向的对象或函数”。您的指针不指向任何对象,因此这一行不适用,并且该段落中没有任何其他内容定义结果。
标签: c++ language-lawyer