3

在 C++11 中,为浮点数的引用std::numeric_limits<Type>::max_digits10返回 0 有什么好处?Type

例如:

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 。

在什么情况下零值会有所帮助,而不是给出编译时错误?

4

2 回答 2

2

根据 C++ 标准 (n4659),在类模板中numeric_limits,默认值为.max_digits100

21.3.4 类模板 numeric_limits [numeric.limits]

namespace std {
template<class T> class numeric_limits {
public:
...  
static constexpr int max_digits10 = 0;

只有当模板专门用于floatdouble时,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++ 库标头限制

因此,除了max_digits10给定特定值的特化之外,默认值是0因此max_digits10对浮点类型的引用的值也是0.

于 2019-03-07T05:35:50.407 回答
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;
于 2019-03-07T17:41:19.063 回答