我一直都知道标准要求取消引用null
是UB。但是,
p = 0; * P;本质上不是一个错误。
并提供
的链接除非将左值转换为左值,否则当p为空时,* p不是错误
(我认为这是一个错字,可能应该读左值转换为右值 )
Link 1也说
char * p = 0; char * q =& *(p)
是“未定义”,我只能将其视为定义明确的或至少实现定义的
语言律师可以提供有关正在发生的事情的权威解释吗?
答案 0 :(得分:4)
我在this answer中通过空指针探讨了间接的主题。简而言之,它本身确实是明确定义的,正如您引用的核心问题中所阐述的那样。该委员会使用了许多年前提出的空左值的概念(但从未采用过); *p
应该是一个空的左值,除非我们尝试访问该左值后面的(不存在的)内存位置(例如,通过执行左值到右值的转换),所有其他操作都表现不佳正如所料。例如。 &*p
相当于p
,除非p
无效。 (这也适用于指向数组末尾的指针,这对于常见的习语&arr[n]
来说是必需的)。
我也开始起草一个paper for empty lvalues(这是WIP,并且针对N4640的基础尚未完成),所以我们有机会在后期。