Por que copiamos e depois movemos?

Eu vi o código em algum lugar em que alguém decidiu copiar um objeto e, em seguida, movê-lo para um membro de dados de uma classe. Isso me deixou confuso, pois achei que o objetivo da mudança era evitar a cópia. Aqui está o exemplo:

struct S
{
    S(std::string str) : data(std::move(str))
    {}
};

Aqui estão minhas perguntas:

Por que não estamos tomando uma referência de valor parastr?Uma cópia não será cara, especialmente dada algo comostd::string?Qual seria a razão para o autor decidir fazer uma cópia e depois mudar?Quando devo fazer isso sozinho?

questionAnswers(4)

yourAnswerToTheQuestion