GCC(4.7.2)-Wextra
发出以下警告/错误信号(我已-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;
}
– 事实上,这就是我首先使用专门模板的原因(请注意,使用了正确的模板专门化,并且我的第一个代码中的错误是由模板参数引发的,而不是在未专门模板的函数内部) . 有没有办法绕过这个警告?如果不是,那不是编译器中的错误吗?