Я задал этот вопрос: static_assert из const Переменная
И, очевидно, это сводится к вопросу, преобразовывается ли lvalue с плавающей запятой в r для сравнения?
Итак, в этом коде происходит преобразование lvalue в rvalue?
const float foo = 13.0F;
static_assert(foo > 0.0F, "foo must be greater than 0.");
Да, это выполняется. В основном это все потому, что 3.0 > 1.2
является правильно сформированным выражением, которое содержит только значения для операндов.
Первый, [Выражение] / 9 утверждает (выделение мое), что
Всякий раз, когда выражение glvalue появляется как операнд оператора
что ожидает prvalue для этого операнда, lvalue-to-rvalue,
Стандартные преобразования массива в указатель или функции в указатель
применяется для преобразования выражения в значение.
Таким образом, вопрос действительно сводится к «Есть ли реляционные операторы ожидать првалу для операндов «? И ответ на это тоже да. Ибо нам нужно рассмотреть [Expr.rel] / 1:
relational-expression: shift-expression relational-expression < shift-expression relational-expression > shift-expression relational-expression <= shift-expression relational-expression >= shift-expression
Операнды должны иметь арифметику, перечисление или тип указателя.
операторы < (меньше чем),> (больше чем), <= (меньше или равно),
и> = (больше или равно) все дают false или true. Тип
результат bool.
Вышеупомянутое производство грамматики — важный бит. Мы можем следить за этим (я не буду делать это полностью здесь) и уменьшить shift-expression
к primary-expression
, И одна из постановок primary-expression
это literal
, За что сказано в [Expr.prim.literal]:
Литерал — это первичное выражение. Его тип зависит от его формы.
строковый литерал является lvalue; все остальные литералы являются значениями.
А также так как большинство литералов являются значениями, я думаю, что можно с уверенностью сказать, что реляционные операторы ожидать значения для операндов.
Других решений пока нет …