c++ - 取消引用 null 并不总是 UB?

标签 c++ language-lawyer undefined-behavior

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

(Link 1)

p = 0; *p; is not inherently an error.

并提供链接

(Link 2)

*p is not an error when p is null unless the lvalue is converted to an lvalue

(我认为这是一个打字错误,可能应该阅读lvalue is converted to an rvalue)

链接 1 也说

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

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

语言律师能否对发生的事情提供权威的解释?

最佳答案

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

我也开始起草 paper for empty lvalues (这是 WIP,针对 N4640 的 rebase 尚未完成),因此我们有可能在稍后阶段看到更多此类内容。

关于c++ - 取消引用 null 并不总是 UB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43533262/

相关文章:

c++ - 防止在 Windows 中取消停靠计算机

c++ - 什么时候 `this` 是右值?

html - 奇怪的 HTML 注释行为

c++ - vector 中的无效迭代器

c++ - Valgrind 能捕捉到各种未定义的行为吗?

c++ - 发送 cURL PUT 命令以使用 libcurl 在 C++ 中以编程方式在 webhdfs 中创建文件

c++ - 无效转换、未指定行为和字符数组?

c++ - 函数中作为引用的指针地址

c++ - 使用不带 std::literals 的后缀

c++ - 枚举类的C样式强制转换为基础类型char的引用