在类型通用代码中使用-Wtype-limits

我有一个函数可以对泛型类型的值执行否定检查(当然,我不想假设该类型,它不一定是模板化的)。但是,启用-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编译器。

LOVE_LIXIA 回答:在类型通用代码中使用-Wtype-limits

我不确定是否值得对可读性产生影响,但是您可以使用通用lambda将比较移到模板上下文中。 GCC不会在模板代码中对此发出警告:

-ErrorAction Stop

或者可能更好地编写一个函数:

$ErrorActionPreference = 'Stop'

并使用它:

if ([](auto v){return v < 0;}(value) || value >= 9)

或仅使用template<typename T> constexpr bool is_negative(T t) { return t < 0; } 也不会警告:

if (is_negative(value) || value >= 9)

GCC还具有std::less个临时禁用警告的信息,请参见this question

if (std::less()(value,0) || value >= 9)
本文链接:https://www.f2er.com/3169856.html

大家都在问