> But you need std::relocate, AFAIK, in order to implement an "emplace_back-by-relocating" operation.
What is proposed is:
std::vector<T, Alloc>::push_back(std::relocate_t, T value)
{
/* relocate value using std::relocate_at at the end of the vector */
}
std::relocate_t being a tag type to distinguish between other push_back overloads. It is then called like that:
std::vector<T> vec;
T obj;
vec.push_back(std::relocate, reloc obj); // with inline constexpr std::relocate_t std::relocate{};
That way the object is relocated into the function parameter and then from the function parameter to the vector. There may be ways to alleviate that extra relocation.
It is on one hand clearer to write, and on the other hand has the advantage of allowing you to relocate local variables.