If an expression initially has the type “reference to
T” ([dcl.ref], [dcl.init.ref]), the type is adjusted to
T prior to any further analysis.

The expression designates the
object or function denoted by the reference, and the expression
is an lvalue or an xvalue, depending on the expression.

[ Note

: *end note*

]Before the lifetime of the reference has started or after it has ended,
the behavior is undefined (see [basic.life]).

— If a prvalue initially has the type “cv T”, 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 *cv-combined type* of two types T1 and T2
is a type T3
similar to T1 whose cv-qualification signature is:

- for every , is the union of and ;

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 both p1 and p2 are null pointer constants, std::nullptr_t;
- if either p1 or p2 is a null pointer constant, T2 or T1, respectively;
- if T1 or T2 is “pointer to cv1 void” and the other type is “pointer to cv2 T”, where T is an object type or void, “pointer to cv12 void”, 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 cv1 C1” and T2 is “pointer to cv2 C2”, where C1 is reference-related to C2 or C2 is reference-related to C1, the cv-combined type of T1 and T2 or the cv-combined type of T2 and T1, respectively;
- if T1 is “pointer to member of C1 of type cv1 U1” and T2 is “pointer to member of C2 of type cv2 U2” where C1 is reference-related to C2 or C2 is reference-related to C1, the cv-combined type of T2 and T1 or the cv-combined type of T1 and T2, respectively;
- otherwise, a program that necessitates the determination of a composite pointer type is ill-formed.