Para dar suporte à semântica de movimentação, os parâmetros de função devem ser tomados por unique_ptr, value ou rvalue?

Uma das minhas funções pega um vetor como parâmetro e o armazena como uma variável de membro. Estou usando const referência a um vetor como descrito abaixo.

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

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

No entanto, às vezesitems contém um grande número de strings, então eu gostaria de adicionar uma função (ou substituir a função por uma nova) que suporte a semântica de movimento.

Estou pensando em várias abordagens, mas não tenho certeza de qual escolher.

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) passar por valor e mover

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

3) rvalue

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

Qual abordagem devo evitar e por quê?

questionAnswers(4)

yourAnswerToTheQuestion