C ++ 11: Verwendet std :: move nur für temporäre Objekte sicher?

8

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?

    
bombax 26.08.2015, 21:00
quelle

2 Antworten

13

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.

    
Benjamin Lindley 26.08.2015, 21:05
quelle
3

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 .

    
Niall 26.08.2015 21:06
quelle

Tags und Links