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?