Какова польза от max_digits10 равно 0 на ссылки на типы с плавающей точкой?

Вопрос задан: 9 месяцев назад Последняя активность: 9 месяцев назад
up 3 down

В 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.

При каких обстоятельствах были бы нулевое значение полезно, в отличие от давая компиляции ошибки времени?

2 ответа

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 2 down

В соответствии с C++ стандарт (n4659), в numeric_limits шаблон класса значения по умолчанию для max_digits10 является 0.

numeric_limits шаблон 21.3.4 Класс [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;

Реализации также следить за этим. См заголовок стандартной библиотеки C++ GCC в пределы например.

Так, по специализациям, где кроме max_digits10 дается конкретное значение, то значение по умолчанию 0 и, следовательно, значение max_digits10 для ссылок на плавающие тип также 0.

up 0 down

У меня нет правильного ответа на вопрос «почему». Купить я мог бы использовать этот код:

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;