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

时间:2018-01-29 09:44:59

标签: c++ g++ undefined-behavior

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

int a = 0;
a = a++;

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

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

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

对于序列点,我并没有对我大喊大叫。它似乎应该是显而易见的。 有没有什么好的解释为什么这两个例子被编译器区别对待?

1 个答案:

答案 0 :(得分:5)

这可能看起来很明显UB,但你必须明白,有许多不同的方法违反了排序规则。并且证明任何特定表达是否违反是一个缓慢而复杂的过程,有时候结果是不可能的。这就是为什么违反这些规则已经在标准中指定了未定义的行为,而不是在每一个可能的违规行为都需要诊断的格式错误。

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