If a prvalue initially has the type “cvT”, where
T is a cv-unqualified non-class, non-array type, the type of
the expression is adjusted to T prior to any further analysis.
The composite pointer type of
two operands p1 and
p2 having types T1 and T2, respectively, where at least one is a
pointer or pointer-to-member type or
std::nullptr_t, is:
if T1 or T2 is “pointer to cv1void” and the
other type is “pointer to cv2T”,
where T is an object type or void,
“pointer to cv12void”,
where cv12 is the union of cv1 and cv2;
if T1 or T2 is “pointer to noexcept function” and the
other type is “pointer to function”, where the function types are otherwise the same,
“pointer to function”;
if T1 is “pointer to cv1C1” and T2 is “pointer to
cv2C2”, where C1 is reference-related to C2 or C2 is
reference-related to C1 ([dcl.init.ref]),
the qualification-combined type ([conv.qual])
of T1 and T2 or the qualification-combined type of T2 and T1,
respectively;
if T1 or T2 is
“pointer to member of C1 of type function”,
the other type is
“pointer to member of C2 of type noexcept function”, and
C1 is reference-related to C2 or
C2 is reference-related to C1 ([dcl.init.ref]),
where the function types are otherwise the same,
“pointer to member of C2 of type function” or
“pointer to member of C1 of type function”, respectively;
if T1 is
“pointer to member of C1 of type cv1U” and
T2 is
“pointer to member of C2 of type cv2U”,
for some non-function type U,
where C1 is
reference-related to C2 or C2 is reference-related to
C1 ([dcl.init.ref]), the qualification-combined type of T2 and T1 or the qualification-combined type
of T1 and T2, respectively;