Warum gibt es sowohl in <algorithm> als auch in <utility> eine std :: move

8

Meistens wird std::movehier auf die <utility>Version verwiesen .

Das std::movein macht<algorithm> tatsächlich das, was sein Name andeutet, move , während das std::movein<utility> sein Argument auf einen x-Wert umwandelt, was im Grunde nur ein Vorverarbeitungsschritt ist, um den x-Wert schließlich in einen l-Wert zu verschieben. Ist es also nicht verwirrend, movewenn beide benannt werden, wenn die Funktionen für beide unterschiedlich sind?

Iamanon
quelle
2
Ja, movehätte angerufen werden sollen make_rvalueoder so ähnlich. Es ist frustrierend, immer wieder zu erklären, dass der einzelne Parameter std::movetatsächlich nichts bewegt.
NathanOliver
Der in <algorithm>ist einfach der in einem <utility>auf einen ganzen Bereich angewendeten.
Rin Kaenbyou
1
@KaenbyouRin Ja, aber derjenige in <algorithm>führt die Verschiebung tatsächlich aus (vorausgesetzt, für den Typ, den wir verschieben, ist ein Verschiebungszuweisungsoperator definiert).
Iamanon
1
Hot Take: Sie hätten std::moveeinen Operator anstelle einer Bibliotheksfunktion erstellen sollen. Jeder bessere Name als std::movewäre länger gewesen, was scheiße ist.
Brian

Antworten:

7

Ist es nicht verwirrend, wenn beide als Zug bezeichnet werden?

Dies kann verwirrend sein, insbesondere diejenigen, die nicht an Sprachen gewöhnt sind, die Überladung unterstützen. Es ist richtig, dass Programmierrichtlinien normalerweise Überladungen mit unterschiedlichen Bedeutungen abschrecken.

Es ist aber auch nicht sehr schwer zu lernen, dass es zwei Funktionen mit demselben Namen gibt, obwohl dies subjektiv ist. Die verschiedenen Argumentlisten bieten ausreichend Kontext, um sie leicht voneinander zu unterscheiden.

Warum gibt es einen std :: move in beiden und

Weil die Designer der Sprache für beide Funktionen den gleichen Namen gewählt haben.

std::moveist eine sehr prägnante Möglichkeit, beide Funktionen auszudrücken. Der in <algorithm>ist komplementär zu std::copyaus demselben Header.

wohingegen std :: move in sein Argument in einen x-Wert umwandelt, was im Grunde nur ein Vorverarbeitungsschritt für das eventuelle Verschieben ist

Die Beschreibung der Funktion der Funktion ist nicht das einzige, was der Name der Funktion ausdrücken kann. In diesem Fall drückt der Name die Absicht des Programmierers aus, der die Funktion verwendet hat: Der Programmierer beabsichtigt, - wenn möglich - vom Argument lvalue abzuweichen.

Dies ist etwas, das Programmierer möglicherweise häufig schreiben müssen. Daher besteht Bedarf an einem sehr kurzen Namen.

Eerorika
quelle