I've become quite fond of a utility called `CopyTemp` which exists in the Unreal Engine code base.  So much so that I think that it should be standardized.  For lack of a better name, I'll call it `std::duplicate`.

Like std::move, std::duplicate would take an argument of any value category and provide a return which is an rvalue.  However, std::duplicate would accomplish this by copying when it had to. Sample Implementation

Once we have this utility, we are able to say that the best practice for providing a sink parameter is to declare it with rvalue reference type.  Attempts to call the sink with lvalue arguments will cause a compiler error forcing to caller to either `std::move` or `std::duplicate` the arg when passed into the call.  Compilers would be able to provide very clean, readable errors if they wanted to, and the resulting code would be optimal in terms of number of copies and moves.

The strengths of this proposal are:
- It is library only
- It is tiny, self contained, and easy to implement
- Helps solve a problem for which we have no great best practice (sink parameters) in a teachable, optimal way which actually makes the calling code more safe and readable