使用引用不会导致有关未定义行为的警告
Using reference causes no warning about undefined behaviour
我一直在研究未定义的行为示例,C++,我发现了以下一个:
int a = 0;
a = a++;
用g++ -Wall -Wextra
尝试过,它让我警告了序列点。
但后来我想到了另一种使用参考的情况:
int a = 0;
int &b = a;
b = a++;
这个没有对我大喊序列点。似乎应该这样做几乎很明显。是否有任何很好的解释为什么编译器对这两个示例的处理方式不同?
这似乎是显而易见的 UB,但您必须了解,有无数种不同的方法可以违反排序规则。证明任何特定的表达是否违规是一个缓慢而复杂的过程,有时被证明是不可能的。这就是为什么违反这些规则的行为在标准中被指定为未定义的行为,而不是格式错误,这需要对每个可能的违规行为进行诊断。
因此,编译器必须在某处画一条线,而不是花费资源来验证所有表达式。您的测试显示位于该"线"相对两侧的两个表达式。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- G++ 编译器未为未定义的方法生成错误/警告
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 链接时突然收到maxrregcount警告和未定义的引用错误
- 关于静态模板化 constexpr 的 Clang 警告(未定义内联函数)
- C 17 GCC编译器为什么会发出有关未定义的警告
- 如果可能存在未定义行为,为什么编译器不警告您?
- 警告:#Warning qopenglfunctions.h与GLEW不兼容,GLEW定义将未定义[-Wcpp]
- GCC警告已声明但未定义的变量
- 可以在编译时警告未定义的行为
- 关于未定义操作的编译器警告
- NVCC/CUDA 3.1 - ghtr-default.h 泛洪"declared static"但未定义的警告
- 如果局部堆栈变量是未定义的行为,为什么编译器会发出有关返回对局部堆栈变量的引用的警告
- C++未定义的引用...还有警告:已弃用从字符串常量到 'char*' 的转换