Geeignetes Verfahren zum Weiterleiten der rvalue-Referenz

8

Ich habe den folgenden Code:

%Vor%

Im obigen Code wird die void bar(const std::string& str) overload aufgerufen. Wenn ich möchte, dass die% code%% overload aufgerufen wird, muss ich entweder bar(std::string&& str) oder bar(std::move(str));

schreiben

Offensichtlich ist der Vorwärts-Code länger, aber er macht mehr Sinn für mich. Meine Frage ist, was häufiger verwendet und bevorzugt wird. Schreiben bar(std::forward<std::string>(str)); wäre die beste Lösung imo, aber das ist keine Option:)

    
rozina 21.09.2015, 08:19
quelle

2 Antworten

6

Zitieren von Effektives modernes C ++

  

Aus rein technischer Sicht ist die Antwort ja: std :: forward kann alles. std :: move ist nicht notwendig. Natürlich ist keine der beiden Funktionen wirklich notwendig, weil wir überall Casts schreiben könnten, aber ich hoffe, wir sind uns einig, dass das, naja, eklig wäre. Die Vorteile von std :: move sind Bequemlichkeit, geringere Fehlerwahrscheinlichkeit und größere Klarheit.

Verwenden von std::move hier

%Vor%

gibt str als R-Wert-Referenz zurück (was genau das ist, was Sie erreichen wollen), während std::forward entweder eine lvalue-Referenz (die Sie nicht interessiert) oder eine rvalue-Referenz (also äquivalent in diesem Fall zu std::move ). Offensichtlich würde die Verwendung von none den const std::string& str 1 immer aufrufen, da str ein lvalue in dieser Funktion ist.

Bottom-line: Sie würden das gleiche tun, aber std::move ist seit

bevorzugt
  • Es wird vermieden, Template-Argumente explizit anzugeben
  • Es ist mehr idiomatisch
  • Es geht direkt auf den Punkt: std::forward soll nicht so verwendet werden (vgl. Universelle Referenzen ) oder in diesem Kontext, obwohl es sicherlich funktionieren würde

Ich stimme zu, dass " ich diesen Verweis auf die andere Funktion weiterleite", könnte als eigenständiger Satz Sinn machen, aber irgendwie fehlt der Punkt der Sache. Du könntest dein Gehirn neu verkabeln, um es zu denken " Bewege diesen rvalue Verweis auf die andere Funktion "

Auch möglicherweise verwandt: Ссылка

    
Marco A. 21.09.2015, 08:59
quelle
3

Sie können es verschieben, wenn Sie sicher sind, dass es sich um eine rvalue-Referenz handelt.

Vorwärts sollte in Vorlagencode verwendet werden, wenn Sie nicht sicher sein können, ob es sich um einen rvalue- oder lvalue-Verweis handelt. :)

In Vorlagencode & amp; & amp; mittlere universelle Referenz, die entweder rvalue oder lvalue sein kann.

Beachten Sie auch, dass std :: move es ohne Überprüfung ausgibt, im Gegensatz zu vorwärts. Wenn also vorwärts sicherer ist, wenn Sie nicht sicher sind, was Sie tun sollen, ist die Bewegung schneller.

    
Melkon 21.09.2015 09:04
quelle

Tags und Links