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