C++ Logo

std-proposals

Advanced search

std::duplicate

From: Michael Daum <mike.daum_at_[hidden]>
Date: Wed, 2 Oct 2019 12:03:21 -0400
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
<https://godbolt.org/z/7nIJNT>

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.
Example <https://godbolt.org/z/Q_E_J->

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

Received on 2019-10-02 11:05:44