我一直在研究C ++的未定义行为示例,并且我发现了以下一个:
int a = 0;
a = a++;
用g++ -Wall -Wextra
尝试了它,它让我对序列点发出警告。
但后来我想到了另一种使用引用的情况:
int a = 0;
int &b = a;
b = a++;
对于序列点,我并没有对我大喊大叫。它似乎应该是显而易见的。 有没有什么好的解释为什么这两个例子被编译器区别对待?
答案 0 :(得分:5)
这可能看起来很明显UB,但你必须明白,有许多不同的方法违反了排序规则。并且证明任何特定表达是否违反是一个缓慢而复杂的过程,有时候结果是不可能的。这就是为什么违反这些规则已经在标准中指定了未定义的行为,而不是在每一个可能的违规行为都需要诊断的格式错误。
因此,编译器必须在某处绘制一条线,而不是花费资源来验证所有表达式。您的测试显示两个表达式位于该“行”的相对侧。