Eu tenho uma função do formuláriovoid foo(std::string str);
Quero usá-lo em dois cenários:
envie uma cópia do valor original para ele:
std::string myString = "any data that I want to keep in its original state" foo(myString);
passe o valor original usando
std::move
:std::string myString = "any data that I don't need anymore" foo(std::move(myString));
Sim, está tudo bem aqui.
foo
está aceitando seu parâmetro por valor , então ele tem que ser construído de alguma forma.No seu primeiro caso, o
str
parâmetro é construído a partir do argumento passado.No seu segundo caso (com o
std::move
), ostr
parâmetro é construído a partir do argumento passado (isso deixará o moved-frommyString
em um estado válido, mas não especificado).Observação:
usar um parâmetro por valor para suportar cópia e movimentação é uma expressão bastante comum.
Um exemplo é implementar um operador de atribuição com um parâmetro por valor juntamente com a expressão copiar-e-trocar.
Veja mais informações aqui: O que é a expressão copiar-e-trocar ?