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?

questionAnswers(7)

yourAnswerToTheQuestion