取下面的代码
#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;
}
where 函数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
在这种情况下可以强制输出警告?