A construção de passagem por valor e movimentação é um idioma ruim?

Como movemos a semântica em C ++, hoje em dia é comum fazer

void set_a(A a) { _a = std::move(a); }

O raciocínio é que sea é um rvalue, a cópia será elidida e haverá apenas um movimento.

Mas o que acontece sea é um valor l? Parece que haverá uma construção de cópia e, em seguida, uma atribuição de movimentação (supondo que A tenha um operador de atribuição de movimentação adequado). As atribuições de movimentação podem ser caras se o objeto tiver muitas variáveis de membro.

Por outro lado, se fizermos

void set_a(const A& a) { _a = a; }

Haverá apenas uma atribuição de cópia. Podemos dizer que esse caminho é preferível ao idioma de passagem por valor se passarmos lvalues?

questionAnswers(7)

yourAnswerToTheQuestion