template<typename T>
inline bool f(T n) {
return n >= 0 && n <= 100;
}
当与unsigned
型用于生成一个警告:
unsigned n;
f(n); // warning: comparison n >= 0 is always true
有没有什么聪明的办法不是做比较n >= 0
时T
是unsigned
类型?我尝试添加部分模板专业化:
template<typename T>
inline bool f(unsigned T n) {
return n <= 100;
}
但gcc 4.2.1不喜欢那样。 (我并不认为那类型的部分模板专业化将是合法的。)
注有函数模板,只有充分专业化无偏特。也就是说,对于函数模板来说,完全专业化通常是一个坏主意,因为关于什么是专门化的,什么是重载的,以及重载决策如何决定使用什么是复杂和复杂的。值得庆幸的是,重载和SFINAE(替换失败不是错误)在这里就足够了。 – 2011-01-21 18:12:53
对此,我从Clang 3.8(或GCC 8.0)没有收到警告。如果我删除`f`上的模板,我可以理解。是否有考虑模板实例化的`-Wtautological-compare`版本? – user2023370 2018-02-01 17:42:57