【发布时间】:2020-02-29 06:59:10
【问题描述】:
我有一个对泛型类型的值执行否定检查的函数(我不想假设该类型,它不一定是模板化的)。但是,启用-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'd out 代码发出警告,如果它会触发警告,因为分配给这些类型的变量的值会超出类型的范围。此外,即使我先将其转换为signed int,GCC 也会发出警告。警告行为与自身不一致,因此这似乎是一个错误。对于这些类型的检查,Clang 根本不会发出警告。
但我想知道是否有办法解决这个问题,我的代码库严格符合 C++14,而且我们被旧的 GCC 编译器困住了。
【问题讨论】: