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