使用引用不会导致有关未定义行为的警告

Using reference causes no warning about undefined behaviour

本文关键字:未定义 警告 引用      更新时间:2023-10-16

我一直在研究未定义的行为示例,C++,我发现了以下一个:

int a = 0;
a = a++;

g++ -Wall -Wextra尝试过,它让我警告了序列点。

但后来我想到了另一种使用参考的情况:

int a = 0;
int &b = a;
b = a++;

这个没有对我大喊序列点。似乎应该这样做几乎很明显。是否有任何很好的解释为什么编译器对这两个示例的处理方式不同?

这似乎是显而易见的 UB,但您必须了解,有无数种不同的方法可以违反排序规则。证明任何特定的表达是否违规是一个缓慢而复杂的过程,有时被证明是不可能的。这就是为什么违反这些规则的行为在标准中被指定为未定义的行为,而不是格式错误,这需要对每个可能的违规行为进行诊断。

因此,编译器必须在某处画一条线,而不是花费资源来验证所有表达式。您的测试显示位于该"线"相对两侧的两个表达式。

相关文章: