取消引用null并不总是UB?

时间:2017-04-21 03:06:09

标签: c++ language-lawyer undefined-behavior

我一直都知道标准要求取消引用null是UB。但是,

(Link 1)

  

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

并提供

的链接

(Link 2)

  除非将左值转换为左值

,否则当p为空时,

* p不是错误

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

Link 1也说

  

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

是“未定义”,我只能将其视为定义明确的或至少实现定义的

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

1 个答案:

答案 0 :(得分:4)

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

我也开始起草一个paper for empty lvalues(这是WIP,并且针对N4640的基础尚未完成),所以我们有机会在后期。