The
lvalue-to-rvalue ([conv.lval]),
array-to-pointer ([conv.array]),
and function-to-pointer ([conv.func])
standard conversions are performed on the operands.
The comparison is deprecated if
both operands were of array type
prior to these conversions ([depr.array.comp]).
If two pointers point to different elements of the same array, or to
subobjects thereof, the pointer to the element with the higher subscript
is required to compare greater.
If two pointers point to different non-static data members of the same
object, or to subobjects of such members, recursively,
the pointer to the later declared member is required to compare greater provided
neither member is a subobject of zero size
and their class is not a union.
If two operands p and q compare equal ([expr.eq]),
p<=q and p>=q both yield true and p<q and
p>q both yield false.
Otherwise, if a pointer to object p
compares greater than a pointer q, p>=q, p>q,
q<=p, and q<p all yield true and p<=q,
p<q, q>=p, and q>p all yield false.
Otherwise, the result of each of the operators is unspecified.
If both operands (after conversions) are of arithmetic or enumeration type, each
of the operators shall yield true if the specified relationship is true
and false if it is false.
As specified in [basic.compound],
an object that is not an array element
is considered to belong to a
single-element array for this purpose and
a pointer past the last element of an array of n elements
is considered to be equivalent to a pointer to a hypothetical array element
n for this purpose.