stackoverflow 问题的共识说这是未定义的行为。
然而,我最近看到了 Charles Bay 在 2016 年的一次演讲,题目是:
指令重新排序无处不在:C++ 的“假设”规则和序列的作用。
在37:53 ,他显示以下内容:
C++ 术语
未定义的行为:缺乏约束
(全局初始化的顺序)未指定行为:违反约束
(取消引用 NULL 指针)
现在我有相互矛盾的信息。
这是一个错字吗?有什么改变吗?
stackoverflow 问题的共识说这是未定义的行为。
然而,我最近看到了 Charles Bay 在 2016 年的一次演讲,题目是:
指令重新排序无处不在:C++ 的“假设”规则和序列的作用。
在37:53 ,他显示以下内容:
C++ 术语
未定义的行为:缺乏约束
(全局初始化的顺序)未指定行为:违反约束
(取消引用 NULL 指针)
现在我有相互矛盾的信息。
这是一个错字吗?有什么改变吗?
这是未定义的行为。
来自C++11 标准的8.3.2 参考(重点是我的):
5 ... [注意:特别是,在定义良好的程序中不能存在空引用,因为创建此类引用的唯一方法是将其绑定到通过取消引用空指针获得的“对象”,这会导致未定义的行为。如 9.6 中所述,引用不能直接绑定到位域。——<em>尾注]
这些示例与错误的事物相关联。无论您假设什么版本的 C++ 标准(即,在这方面,标准内没有任何变化)。
取消引用 NULL 指针会产生未定义的行为。该标准没有对结果发生的情况做出任何限制。
全局变量初始化的顺序是未指定行为的一个示例(标准保证所有全局变量都将被初始化[这是对全局变量如何初始化的限制],但未指定顺序)。