Para admitir la semántica de movimiento, ¿los parámetros de función deben tomarse por unique_ptr, por valor o por rvalue?

Una de mis funciones toma un vector como parámetro y lo almacena como una variable miembro. Estoy usando referencia constante a un vector como se describe a continuación.

class Test {
 public:
  void someFunction(const std::vector<string>& items) {
   m_items = items;
  }

 private:
  std::vector<string> m_items;
};

Sin embargo, a vecesitems contiene una gran cantidad de cadenas, por lo que me gustaría agregar una función (o reemplazar la función por una nueva) que admita la semántica de movimiento.

Estoy pensando en varios enfoques, pero no estoy seguro de cuál elegir.

1) unique_ptr

void someFunction(std::unique_ptr<std::vector<string>> items) {
   // Also, make `m_itmes` std::unique_ptr<std::vector<string>>
   m_items = std::move(items);
}

2) pasar por valor y moverse

void someFunction(std::vector<string> items) {
   m_items = std::move(items);
}

3) valor

void someFunction(std::vector<string>&& items) {
   m_items = std::move(items);
}

¿Qué enfoque debo evitar y por qué?

Respuestas a la pregunta(4)

Su respuesta a la pregunta