Да, выполняется. По сути, это все потому, что 3.0 > 1.2
— это правильно сформированное выражение, которое не содержит ничего, кроме prvalues для операндов.
Во-первых, [expr]/9 утверждает (выделено мной), что
Всякий раз, когда выражение glvalue появляется как операнд оператора, который ожидает значение prvalue для этого операнда, к ним применяются стандартные преобразования lvalue-to-rvalue, массива в указатель или функции в указатель. преобразовать выражение в prvalue.
Таким образом, вопрос на самом деле сводится к "Ожидают ли реляционные операторы ожидание значений prvalue для операндов"? И ответ на это тоже да. Поскольку нам нужно учитывать [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; все остальные литералы являются значениями prvalue.
И поскольку большинство литералов являются значениями prvalue, я думаю, можно с уверенностью сказать, что реляционные операторы ожидают значения prvalue для операндов.
person
StoryTeller - Unslander Monica
schedule
16.01.2018
foo
этоfloat
.0.0
этоdouble
. Должно быть преобразование для сравнения двух типов, поскольку исходные типы не совпадают. - person Jesper Juhl   schedule 27.10.2017