Не вижу технической причины, по которой
struct type {
static const double value = 3.14;
};
запрещено. Любой случай, когда вы найдете, где это работает, связан с непереносимыми функциями, определяемыми реализацией. Они также имеют ограниченное применение. Для интегральных констант, инициализированных в определениях классов, вы можете использовать их и передавать их в шаблоны как нетиповые аргументы, а также использовать их в качестве размера измерений массива. Но вы не можете сделать это для констант с плавающей точкой. Разрешение параметров шаблона с плавающей запятой принесло бы его собственный набор правил, который на самом деле не стоит проблем.
Тем не менее, следующая версия C ++ позволит использовать constexpr
:
struct type {
static constexpr double value = 3.14;
static constexpr double value_as_function() { return 3.14; }
};
И сделает type::value
константным выражением. Тем временем, ваша лучшая ставка - следовать шаблону, также используемому std::numeric_limits
:
struct type {
static double value() { return 3.14; }
};
Он не будет возвращать константное выражение (значение не известно во время компиляции), но это имеет значение только теоретическое, так как практическое значение будет в любом случае встроено. Смотрите предложение constexpr . Содержит
4,4
Floating-point constant expressions
Традиционно оценка
constant постоянное выражение с плавающей точкой на
время компиляции - сложная проблема. За
единообразие и общность, мы предлагаем
чтобы позволить данные с постоянным выражением
Типы плавающих точек, инициализированные
любая постоянная с плавающей точкой
выражения. Это также увеличит
совместимость с C99 [ISO99, §6.6]
что позволяет
[# 5] Выражение, которое оценивается как
константа требуется в нескольких
контексты. Если плавающее выражение
оценивается в переводческой среде
, арифметическая точность и
дальность должна быть как минимум такой же, как если бы
выражение оценивалось в
среда исполнения.