static_assert из const Переменная

У меня есть этот код:

const float foo = 5.0F;

static_assert(foo > 0.0F, "foo must be greater than 0.");

Но в /questions/tagged/visual-studio-2010 я получаю ошибку:

ошибка C2057: ожидаемое постоянное выражение

Я на самом деле делаю это правильно, и /questions/tagged/visual-studio-2010 просто не реализована должным образом static_assert, право? В /questions/tagged/visual-studio-2017 все работает как задумано.


Там были некоторые комментарии различий между const а также constexpr, Я понимаю эту разницу, однако многие компиляторы поддерживают это использование static_assert поэтому я спрошу еще раз, это правовой кодекс или нет? Меня не беспокоит, какой компилятор его поддерживает, меня интересует, определен ли он в соответствии со стандартом C++.

1 ответ

foo > 0.0F не является основным константным выражением:

  1. Выражение e является основным константным выражением, если при вычислении e, следуя правилам абстрактной машины, не будет выполнено одно из следующих выражений:

...

(2.7) преобразование lvalue в rvalue, если оно не применяется к

(2.7.1) энергонезависимое glvalue целочисленного или перечислимого типа, которое относится к полному энергонезависимому объекту const с предшествующей инициализацией, инициализированной с помощью константного выражения, или

(2.7.2) энергонезависимое glvalue, которое ссылается на подобъект строкового литерала, или

(2.7.3) энергонезависимое значение glvalue, которое относится к энергонезависимому объекту, определенному с помощью constexpr, или которое относится к неизменяемому подобъекту такого объекта, или

(2.7.4) энергонезависимое glvalue литерального типа, которое относится к энергонезависимому объекту, время жизни которого началось в пределах оценки e;

foo имеет тип с плавающей точкой, для foo > 0.0F преобразование lvalue в rvalue на foo требуется, что не соответствует вышеуказанным условиям, то foo > 0.0F не считается константным выражением:

Константное выражение - это либо ключевое постоянное выражение glvalue, которое относится к объекту, который является разрешенным результатом постоянного выражения (как определено ниже), либо базовое постоянное выражение prvalue, значение которого удовлетворяет следующим ограничениям

С другой стороны, если объявить foo в качестве целочисленного типа код будет в порядке. LIVE (используяconstexpr вместо const тоже работает LIVE)

Другие вопросы по тегам