У меня есть функция, которая выполняет отрицательную проверку значения универсального типа (ну, я не хочу предполагать тип, он не обязательно шаблонизирован). Однако при включенном -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)
для защиты чека, который является предупреждением, он все еще предупреждает. Я заметил, что GCC не выдает предупреждение для кода if constexpr
, если оно вызовет предупреждения, потому что значение, назначенное переменным этого типа, выпадет из диапазона типа. Кроме того, GCC выдает предупреждение, даже если я сначала приведу его к signed int
. Поведение предупреждения не согласуется с самим собой, поэтому это похоже на ошибку. Clang вообще не выдает никаких предупреждений для этих типов проверок.
Но мне интересно, был ли способ обойти это, моя кодовая база строго совместима с C ++ 14, и мы застряли со старыми компиляторами GCC.