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ê?