在C ++ 11中,std::numeric_limits<Type>::max_digits10
为引用浮点数的Type
返回0的好处是什么?
例如:
constexpr int precisionPositive(const float &floatVal)
{
using numericType = std::remove_reference<decltype(floatVal)>::type;
constexpr int digits = std::numeric_limits<numericType>::max_digits10;
return digits;
}
constexpr int precisionZero(const float &floatVal)
{
using numericType = decltype(floatVal);
constexpr int digits = std::numeric_limits<numericType>::max_digits10;
return digits;
}
precisionPositive
返回9,precisionZero
返回0。
在什么情况下,零值会比给出编译时错误有帮助?
答案 0 :(得分:2)
根据C ++标准(n4659),在numeric_limits
类模板中,max_digits10
的默认值为0
。
21.3.4类模板numeric_limits [numeric.limits]
namespace std { template<class T> class numeric_limits { public: ... static constexpr int max_digits10 = 0;
仅当模板专门用于float
,double
等时,max_digits10
才被赋予特定的值。
考虑 float
的专业化。
21.3.4.2 numeric_limits专长[numeric.special]
namespace std { template<> class numeric_limits<float> { public: ... static constexpr int max_digits10 = 9;
实现也遵循此原则。例如,请参见GCC的标准C ++库标头limits。
因此,除了专门为max_digits10
赋予特定值的特殊化之外,默认值为0
,并且因此,用于引用浮点类型的max_digits10
的值也为0
。
答案 1 :(得分:0)
我对“为什么”问题没有正确的答案。购买我可能会使用以下代码:
C ++ 11:
template<typename T>
using bare_value_t=typename
std::decay<T>::type;
C ++ 14:
template<typename T>
using bare_value_t=
std::decay_t<T>;
C ++ 20:
template<typename T>
using bare_value_t=
std::remove_cvref_t<T>;
并且:
template<typename T>
using limits=
std::numeric_limits<bare_value_t<T> >;
cout<<limits<float&>::max_digits10;