gpt4 book ai didi

c++ - 修复警告 "comparison is always false due to limited range of data type [-Wtype-limits]"

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:28 24 4
gpt4 key购买 nike

我在修复其中一个模板类(使用 C++11)中的 GCC 警告时遇到问题。我在类中有以下成员函数:

void ThrowInvalidArgumentExceptionIfValueIsLessThanMinimumAllowedValue() const {
if (static_cast<std::intmax_t>(value_) < kMinimumValue) {
throw std::invalid_argument{"The specified number " + std::to_string(static_cast<std::intmax_t>(value_)) + " is less than the minimum number " + std::to_string(static_cast<std::intmax_t>(kMinimumValue)) + "."};
}
}

该类具有以下模板签名(使用 CRTP 习惯用法):

template <class TClass,
typename TValue,
std::intmax_t const kMinimumValue,
std::intmax_t const kMaximumValue>

对于包含 if 的行会发出以下警告使用模板签名时的条件(有意义)<DecimalPercentage, std::uint8_t, 0, 100> :

warning: comparison is always false due to limited range of data type [-Wtype-limits]

我认为有问题if条件可能无法编译if (std::numeric_limits<TValue>::is_unsigned && kMinimumValue == 0) ,但我不知道如何修改代码以避免警告。

使用以下版本的 GCC:

gcc (SUSE Linux) 4.7.1 20120723 [gcc-4_7-branch revision 189773]

这里是完整的例子:

#include <cstdint>
#include <stdexcept>

template <class TClass,
typename TValue,
std::intmax_t const kMinimumValue,
std::intmax_t const kMaximumValue>
struct A {
A(TValue const kValue) : value_{kValue} {
// NOOP
}

void some_func() const {
if (static_cast<std::intmax_t>(value_) < kMinimumValue) {
throw std::runtime_error{"foo"};
}
}

TValue value_;
};

struct B : public A<B, std::uint8_t, 0, 100> {
B(std::uint8_t const kValue) : A{kValue} {
// NOOP
}
};

int main() {
B temp{0};
temp.some_func();
}

以及编译示例的命令:g++ main.cc -std=c++11 -Wall -Wextra -pedantic -Wtype-limits

Edit:: 我遇到了 std::enable_if,但我不知道如何使用它。我想有条件地编译该方法,所以我想我需要类似 std::enable_if<std::is_signed<TValue>::value>::type 的东西.有人可以指导我走向正确的方向吗?

最佳答案

unsigned int (uint8_t) 永远不能为负,所以你的检查总是会失败。

static_cast<std::intmax_t>(value_) < kMinimumValue

您正在转换为 intmax_t,但编译器知道您在 main 中传递了一个常量,并且您永远不会实际使用负整数值。

关于c++ - 修复警告 "comparison is always false due to limited range of data type [-Wtype-limits]",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31411271/

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