我有一个函数可以对泛型类型的值执行否定检查(当然,我不想假设该类型,它不一定是模板化的)。但是,启用-Wtype-limits
时,如果所讨论的类型是无符号类型,则编译器会抱怨否定检查。如果类型可能更改为带符号类型,则删除否定检查是一个坏主意,并且禁用警告也不是理想选择,因为它可能会引起合法问题。
using example_t = uint8_t; // could be int8_t or int64_t or really whatever integer type that can store values 0 - 8.
void example(example_t value) {
if (value < 0 || value >= 9) { // <-- errors on the 'value < 0' check
throw std::invalid_argument("some error message");
}
// continue processing ...
}
即使我使用C ++ 17并使用if constexpr(std::is_unsigned<example_t>::value)
来保护警告的检查,它仍然会发出警告。我注意到,如果if constexpr
输出的代码会触发警告,则GCC不会发出警告,因为分配给这些类型的变量的值将超出该类型的范围。此外,即使我先将其强制转换为signed int
,GCC也会发出警告。警告行为与其自身不一致,因此这似乎是一个错误。 Clang不会对这些类型的检查发出任何警告。
但是我想知道是否有解决办法,我的代码库严格符合C ++ 14,并且我们受制于旧的GCC编译器。