cpp/experimental/ranges/utility/swap

Exchanges the values referenced by and.

A call to is equivalent to: @1@, if that expression is valid, where the overload resolution is performed with the following candidates: @@ If the function selected by overload resolution does not exchange the values referenced by and, the program is ill-formed; no diagnostic required. @2@ Otherwise,, if and  are lvalue references to array types of equal extent (but possibly different element types) and  is a valid expression; @3@ Otherwise, if and  are both  for some type  that meets the syntactic requirements of  and, exchanges the referenced values as if by. If the semantic requirements of either concept are not satisfied, the program is ill-formed; no diagnostic required. @4@ In all other cases, a call to is ill-formed.
 * any declarations of found by argument-dependent lookup.
 * any declarations of found by argument-dependent lookup.
 * any declarations of found by argument-dependent lookup.

can be used in a constant expression if every function it calls (as specified above) can be so used.

Exceptions
@1@, where is found as described above. @2@ @3@