采取以下代码
#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
编译它没有给出关于无意义比较的暗示。但是,clang很好地警告我们:
a.cpp:7:11: warning: comparison of unsigned expression < 0 is always false [-Wtautological-compare]
if (y < 0) return x;
~ ^ ~
1 warning generated.
为什么会这样(我假设模板是问题的根源)并且在这种情况下可以强制gcc
输出警告?
答案 0 :(得分:1)
这是某些GCC版本中的回归错误(包括8.x和9.x,在撰写本文时,它们仍是许多发行版中的默认编译器)。
该错误已被here跟踪(@jureslak再次将其归档,但被标记为重复)并已解决。 See the warning with GCC 10.1(Godbolt)。