取消引用null并不总是UB?

Pow*_*ice 8 c++ undefined-behavior language-lawyer

我一直都知道标准规定解除引用null是UB 的事实.然而,

(链接1)

p = 0;*P; 本质上不是一个错误.

并提供链接

(链接2)

当p为null时,*p不是错误,除非将左值转换为左值

(我认为这是一个错字,可能应该读取左值转换为右值)

Link 1也说

char*p = 0; char*q =&*(p)

是"未定义",我只能阅读定义明确或至少是实现定义

语言律师可以提供有关正在发生的事情的权威解释吗?

Col*_*mbo 5

我在这个答案中探讨了通过空指针间接寻址的主题。简而言之,它本身确实是明确定义的,正如您引用的核心问题中所阐述的那样。委员会使用了多年前提出的空左值的概念(但从未被采用);*p应该是这样一个空的左值,除非我们尝试访问该左值后面的(不存在的)内存位置(例如,通过执行左值到右值的转换),否则所有其他操作都会按预期运行。例如&*p相当于p,除非p无效。(这也适用于超出数组末尾的指针,这对于常见的习惯用法是必需的&arr[n])。

我还开始为空左值起草一篇论文(这是 WIP,针对 N4640 的 rebase 尚未完成),因此我们有可能在稍后阶段看到更多此类内容。