Czy konstrukcja pass-by-value-and-potem-move jest złym idiomem?
Ponieważ w C ++ mamy semantykę ruchu, obecnie zwykle tak jest
void set_a(A a) { _a = std::move(a); }
Rozumowanie jest takie, że jeślia
jest wartością r, kopia zostanie usunięta i będzie tylko jeden ruch.
Ale co się stanie, jeślia
to jest lwartość? Wydaje się, że będzie kopia, a następnie przeniesienie (zakładając, że A ma właściwego operatora przypisania ruchu). Przydziały przenoszenia mogą być kosztowne, jeśli obiekt ma zbyt wiele zmiennych składowych.
Z drugiej strony, jeśli to zrobimy
void set_a(const A& a) { _a = a; }
Będzie tylko jedno zadanie kopiowania. Czy możemy powiedzieć, że ten sposób jest preferowany w stosunku do idiomu po wartości, jeśli przekażemy lwartości?