If a function argument is described as being an array,
the pointer actually passed to the function shall have a value such that all
address computations and accesses to objects (that would be valid if the
pointer did point to the first element of such an array) are in fact valid.
If the parameter is a generic parameter of the form T&& and an lvalue of type
A is bound, the argument binds to an lvalue reference ([temp.deduct.call])
and thus is not covered by the previous sentence.
If a program casts
an lvalue to an xvalue while passing that lvalue to a library function
(e.g., by calling the function with the argument std::move(x)), the program
is effectively asking that function to treat that lvalue as a temporary object.
is free to optimize away aliasing checks which might be needed if the argument was