In meinem Code habe ich so etwas:
%Vor% Wie Sie sehen, verwende ich std::move
für ein Objekt vom Typ unordered_map<string, string>&
, was offensichtlich nicht unordered_map<string, string>&&
ist. Dennoch weiß ich sicher, dass, weil rawEntities
nach der for
Schleife den Geltungsbereich verlässt, seine Elemente (die Zeichenketten- & gt; Zeichenketten) nie wieder verwendet werden. Ich denke also, dass es sicher ist, seine Elementdaten zu stehlen (zu bewegen), weil sie nicht mehr verwendet werden.
Wenn ich das Programm starte, scheint es zu funktionieren. Aber ist diese schlechte Praxis / ein Anti-Pattern, und insbesondere, garantiert der Standard, dass es sicher ist?
Im Gegenteil. Die Verwendung von std::move
für temporäre Objekte ist sinnlos. Sie sind bereits R-Werte und werden als R-Wert-Referenzen abgeleitet, wenn sie an Funktionen übergeben werden. Der ganze Punkt von std::move
besteht darin, L-Werte in R-Wert-Referenzen umzuwandeln, so dass sie von verschoben werden können.
Ich denke also, dass es sicher ist, seine Elementdaten zu stehlen (zu bewegen) weil sie nicht wieder verwendet werden.
Ja, das ist richtig.
Im Allgemeinen sind temporäre Objekte ungenannt und sind bereits rvalues . std::move
ist nicht wirklich anwendbar, da es unbenannt ist.
Wann ist std::move
anwendbar? Immer wenn das Objekt abläuft und nicht mehr benötigt wird. Dies ist, was std::move
tut, es wandelt die Wertkategorie so um, dass sie verschoben werden kann.
Es ist ein interessanter Anwendungsfall - den (gefilterten) Inhalt eines Containers stehlen und nicht nur den gesamten Container.
Vorausgesetzt, der Inhalt von vector
wird nicht benötigt, nachdem die for
-Schleife abgeschlossen ist, dann würde es wie erwartet funktionieren .