gpt4 book ai didi

c++ - 将 -Wtype-limits 与类型通用代码一起使用

转载 作者:行者123 更新时间:2023-11-30 04:42:33 25 4
gpt4 key购买 nike

我有一个函数可以对泛型类型的值执行否定检查(好吧,我不想假设该类型,它不一定是模板化的)。但是,使用 -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 发出警告如果它会触发警告,则会输出代码,因为分配给这些类型的变量的值会超出类型的范围。此外,即使我将其转换为 signed int,GCC 也会发出警告。第一的。警告行为与自身不一致,所以这看起来像是一个错误。对于这些类型的检查,Clang 根本不会发出警告。

但我想知道是否有办法解决这个问题,我的代码库严格符合 C++14,而我们仍然使用旧的 GCC 编译器。

最佳答案

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

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)

或者只是使用 std::less 也不会发出警告:

if (std::less()(value, 0) || value >= 9)

GCC 也有 #pragma 来临时禁用警告,参见 this question :

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits"
if (value < 0 || value >= 9) {
throw std::invalid_argument("some error message");
}
#pragma GCC diagnostic pop

关于c++ - 将 -Wtype-limits 与类型通用代码一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58685322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com