Поскольку мы имеем семантику перемещения в С++, в настоящее время обычно выполняется
void set_a(A a) { _a = std::move(a); }
Полагают, что если a
- значение r, копия будет удалена, и будет только один ход.
Но что произойдет, если a
является lvalue? Кажется, что будет построена копия, а затем задание перемещения (при условии, что A имеет правильный оператор присваивания перемещения). Перемещение назначений может быть дорогостоящим, если объект имеет слишком много переменных-членов.
С другой стороны, если мы выполняем
void set_a(const A& a) { _a = a; }
Будет назначено только одно копирование. Можем ли мы сказать, что этот путь предпочтительнее по сравнению с идиомой pass-by-value, если мы пройдем lvalues?