即使启用了 Wextra,gcc 也不会给出将无符号整数< 0 进行比较的警告
gcc gives no warning for comparing unsigned integer < 0 even with Wextra enabled
采用以下代码
#include <iostream>
template<typename T>
T f(T x, unsigned y) {
if (y < 0) return x;
return static_cast<T>(0);
}
using namespace std;
int main() {
int a = f(2, 3);
std::cout << a << std::endl;
return 0;
}
其中函数f
显然总是返回 0。用g++-7.2.0 -Wall -Wextra
编译它并没有给出毫无意义的比较的暗示。然而,叮当很好地警告我们:
a.cpp:7:11: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
if (y < 0) return x;
~ ^ ~
1 warning generated.
为什么会这样(我认为模板是问题的根源(,在这种情况下gcc
可以强制输出警告吗?
这是某些版本的GCC中的一个回归错误(包括8.x和9.x - 在撰写本文时,它们仍然是许多发行版的默认编译器(。
该错误已在此处跟踪(@jureslak再次归档,但被标记为欺骗(并已解决。请参阅 GCC 10.1 (Godbolt( 的警告。
相关文章:
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 计算机使用什么方法添加无符号整数
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数
- 如何安全地比较两个无符号整数计数器?
- 计算 (64 位无符号整数) * (64 位无符号整数) 的商除以 2^64
- 如何将 32 位无符号整数分配给包含 32 位的位字段
- 如何将以"\0"开头的字符 * 转换为无符号整数?
- *(易失性无符号整数 *) 的含义 0x00 = 0x00;
- 为大无符号整数分配内存的有效方法
- 获取两个无符号整数 C++ 乘积的高 32 位的有效方法