Ist das Pass-by-Value-and-Then-Move-Konstrukt eine schlechte Redewendung?

Da wir in C ++ eine Verschiebungssemantik haben, ist dies heutzutage üblich

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

Die Argumentation ist, dass wenna Ist dies ein Wert, wird die Kopie entfernt und es wird nur ein Zug ausgeführt.

Aber was passiert wenna ist ein lWert? Es scheint, als gäbe es eine Kopierkonstruktion und dann eine Verschiebungszuweisung (vorausgesetzt, A hat einen geeigneten Verschiebungszuweisungsoperator). Verschiebungszuweisungen können kostspielig sein, wenn das Objekt zu viele Mitgliedsvariablen enthält.

Auf der anderen Seite, wenn wir das tun

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

Es wird nur eine Kopieraufgabe geben. Können wir sagen, dass dieser Weg der Pass-by-Value-Redewendung vorgezogen wird, wenn wir l-Werte übergeben?

Antworten auf die Frage(7)

Ihre Antwort auf die Frage