It seems from the comments that what you want is to take a vector, modify it destructively (in the sense that the original state cannot be reset) and then use the result internally. And you want this to work efficiently for both lvalues and rvalues.
The next question is whether in the case of the lvalue, the code that holds the original container needs it after the function call has completed, and if it needs the original state of the vector or not. Depending on the answers to that you have different solutions:
The caller holding an lvalue does not use it anymore after the call
(or alternatively, the caller holding the lvalue needs the original state)
This is the simplest case. Then your function should take the container by value. If the caller has an lvalue, it can std::move
to avoid the copy (it does not care about the object anymore) or copy which might be more expensive but leaves the original container untouched.
If the function is called with an rvalue then the copy will be either elided or transformed into a cheap implicit move.
The caller holding the lvalue does not need the original state, but it needs the container
This case is the hard one, and you will need to provide two overloads for the same function (or lambda), one taking an lvalue to be used by this caller and a different taking an rvalue-reference for the case where the caller hands a temporary. In both cases the binding will be cheap. While this requires more code, you can implement one overload in terms of the other:
rtype f(std::vector<Data> & ); // for lvalues
rtype f(std::vector<Data> && v) // for rvalues
{ return f(v); } // v is an lvalue here
The fact that you are doing lambdas might make this slightly more complicated, but hopefully not too much.