Использование Numeric_Limits :: Max () в постоянных выражениях
-
02-10-2019 - |
Вопрос
Я хотел бы определить внутри класса постоянную, какую ценность является максимально возможным Int. Что-то вроде этого:
class A
{
...
static const int ERROR_VALUE = std::numeric_limits<int>::max();
...
}
Это объявление не скомпилировало со следующим сообщением:
numeric.cpp: 8: Ошибка: 'std :: numeric_limits :: max ()' не может появиться в постоянном выражении numeric.cpp: 8: Ошибка: Вызов функции не может появиться в постоянном выражении.
Я понимаю, почему это не работает, но две вещи выглядят странно для меня:
Мне кажется естественное решение использовать ценность в постоянных выражениях. Почему дизайнеры языка решили сделать Максимум() Функция, таким образом, не позволяющая этому использованию?
Спецификация претензий в 18.2.1, что
Для всех членов заявлено Static Const в шаблоне Numeric_limits, специализации должны определять эти значения таким образом, чтобы они были полезны в качестве интегральных постоянных выражений.
Разве это не значит, что я должен быть в состоянии использовать его в моем сценарии и не противоречит сообщение об ошибке?
Спасибо.
Решение
Хотя текущий стандарт не хватает поддержки здесь, для интегральных типов Boost.integertraits. дает вам константы времени компиляции const_min
а также const_max
.
Проблема возникает из §9.4.2/4:
Если статический элемент данных имеет встроенный тип перечисления Const, его декларация в определении класса может указать константу-инициализатор, который должен быть интегральным постоянным выражением (5.19). В этом случае член может появиться в интегральных постоянных выражениях.
Обратите внимание, что добавляет:
Участник все еще должен быть определен в области пространства, если он используется в программе, и определение области пространства имен не должно содержать инициализатора.
Как другие уже упомянутые numeric_limit
с min()
а также max()
Просто не встроенные постоянные выражения, то есть константы времени компиляции.
Другие советы
Выглядит как немного дефекта ...
В C ++ 0x, numeric_limits
будет иметь все отмеченное constexpr
, означает, что вы сможете использовать min()
а также max()
как константы с компиляцией.
Ты хочешь:
#include <limits>
struct A {
static const int ERROR_VALUE;
};
const int A::ERROR_VALUE = std::numeric_limits<int>::max();
Поместите класс / структуру в заголовке и определение в файле .CPP.
Это не противоречит, потому что max
не определен static const
. Отказ Это просто статическая функция участника. Функции не могут быть Const, и функции статического элемента не могут иметь конский прикрепленный в самом праве.
Есть также double max()
в двойной версии пределов, а в C ++ 03 это не будет работать, чтобы сказать static double const max = ...
. Отказ Так, чтобы быть последовательным, max()
это функция для всех версий предельного шаблона.
Теперь, как известно, что max()
не может быть использован таким, как это плохо, а C ++ 0x уже решает его, делая его constexpr
Функция, позволяющая вашему предлагаемому использованию.
- Я постараюсь ответить вам так сильно, как я понял из вашего вопроса:
1- Если вы хотите, чтобы статический Const int в вашей программе будет инициализироваться с функцией:
int Data()
{
return rand();
}
class A
{
public :
static const int ee;
};
const int A::ee=Data();
Это работает на VS 2008
2- Если вы хотите получить максимальный и мин номер для данного типа данных, то используйте эти определения INT_MAX, INT_MIN, Long_max и т. Д.
3-, если однако, вам нужно использовать эти тип шаблона WRT, затем жесткий код шаблонов себя
template<>
int MaxData()
{
return INT_MAX;
}
а также
template<>
long MaxData()
{
return LONG_MAX ;
}
и называть их как это
int y=MaxData<int>();
4- И если вы только имеете дело с бинарными представленными типами, то используйте это:
template <class T>
T MaxData(){
return ~(1<<((sizeof(T)*8)-1));
}
и это
template <class T>
T MinData(){
return (1<<((sizeof(T)*8)-1));
}
Надеюсь, это может помочь вам ..