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

Dev*_*laN 1 c++ g++ undefined-behavior

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

int a = 0;
a = a++;
Run Code Online (Sandbox Code Playgroud)

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

但后来我考虑使用参考的另一种情况:

int a = 0;
int &b = a;
b = a++;
Run Code Online (Sandbox Code Playgroud)

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

eer*_*ika 5

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

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