修复警告"comparison is always false due to limited range of data type [-Wtype-limits]"
Fix of warning "comparison is always false due to limited range of data type [-Wtype-limits]"
我在一个模板类(使用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>
当使用模板签名<DecimalPercentage, std::uint8_t, 0, 100>
时,对于具有if
条件的行(这是有意义的)会引发以下警告:
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中传递了一个常量,并且你永远不会实际使用负整数值
相关文章:
- Usages of std::move
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 具有变量Number of Arguments的std::函数的矢量
- Capacity of a deque
- Deprecation of _writeBarrier()
- constexpr begin of a std::array
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- C++ "error: invalid use of void expression"
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 收到错误"invalid use of non-static data member 'stu::n' "
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 为什么当我尝试在类中创建数组时"invalid use of non-static data member"我会收到错误?
- C++ 小错误:"... is not a static data member of ‘class ...'"
- 访问父类的成员"Invalid use of non-static data member" C++
- 摆脱"warning C4267 possible loss of data"的最佳策略是什么?
- C++类模板和嵌套结构。 "Invalid use of non-static data member..."
- getaddrinfo() 返回错误"The requested name is valid, but no data of the requested type was found."
- 如何将"Any kind of data"传递给 C++ 中的函数
- 修复警告"comparison is always false due to limited range of data type [-Wtype-limits]"