The lvalue-to-rvalue conversion ([conv.lval])
is applied to each operand and
the resulting prvalues are used in place of the original operands
for the remainder of this section.
If either operand is of scoped enumeration type ([dcl.enum]), no conversions
are performed; if the other operand does not have the same type, the expression is
ill-formed.
Otherwise, if one operand is of enumeration type and the other operand is
of a different enumeration type or a floating-point type, the expression is
ill-formed.
Otherwise, if the floating-point conversion ranks ([conv.rank]) of
the types of the operands are ordered but not equal,
then the operand of the type with the lesser floating-point conversion rank
is converted to the type of the other operand.
Otherwise, if the floating-point conversion ranks of the types of
the operands are equal,
then the operand with the lesser floating-point conversion subrank ([conv.rank])
is converted to the type of the other operand.