First off, this question is not a duplicate of Function dual to std::move? or of Does the inverse of std::move exist?. I am not asking about a mechanism to
This appears to work in all of your cases:
template constexpr typename std::remove_reference::type& copy(T&& t) { return t; };
It's exactly like std::move, except it returns an lvalue reference instead.
std::move