-Wextra
次の警告/エラーを通知するGCC(4.7.2) (-Werror
有効にしました):
データ型の範囲が制限されているため、比較は常に真です [-Wtype-limits]
次のコードの場合 [オンラインで試す]:
template <
typename T,
std::size_t N,
bool = static_cast<std::size_t>(std::numeric_limits<T>::max()) < N>
struct validator {
static constexpr bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
};
template <typename T, std::size_t N>
struct validator<T, N, true> {
static constexpr bool validate(T) {
return true;
}
};
int main() {
// Works
static_assert(validator<int, 4>::validate(3), "Invalid");
// Error :-(
static_assert(validator<bool, 2>::validate(true), "Invalid");
}
validate
次の関数を使用した場合など、通常の式のコンテキストで警告が発生する理由を理解しています。
template <typename T, std::size_t N>
bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
– 実際、それが私が最初に特殊化されたテンプレートを使用している理由です (そして、正しいテンプレートの特殊化が使用され、最初のコードのエラーは、特殊化されていないテンプレートの関数内ではなく、テンプレート引数によって発生することに注意してください) . この警告を回避する方法はありますか? そうでない場合、それはコンパイラのバグではありませんか?