If T and U are different types that model
common_­reference_­with<const T&, const U&>,
the result of the operation is that
C(t1) equals C(u2)
and
C(u1) equals C(t2)
where C is common_­reference_­t<const T&, const U&>.

Otherwise, if E1 and E2
are lvalues of array types ([basic.compound])
with equal extent and ranges​::​swap(*E1, *E2)
is a valid expression,
S is (void)ranges​::​swap_­ranges(E1, E2),
except that
noexcept(S) is equal to
noexcept(​ranges​::​swap(*E1, *E2)).