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
не является основным константным выражением:
- Выражение 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)