std :: forward vs. std :: move, während lvalue an rvalue reference gebunden wird

7

Gibt es hier einen Unterschied zwischen move und forward:

%Vor%     
Guillaume07 28.07.2011, 19:57
quelle

2 Antworten

29

In Ihrem speziellen Fall, nein, gibt es keinen Unterschied.

Detaillierte Antwort:

Unter der Haube hat std::move(t) static_cast<typename std::remove_reference<T>::type&&>(t) , wobei T der Typ t ist (siehe §20.2.3 / 6). In Ihrem Fall wird es in static_cast<int&&>(nb) aufgelöst.

forward ist ein bisschen knifflig, weil es für die Verwendung in Templates zugeschnitten ist (um eine perfekte Weiterleitung zu ermöglichen) und nicht als Werkzeug, um lvalue auf rvalue zu referenzieren.

Die Standardbibliothek bietet zwei Überladungen (eine für lvalue-Referenzen und die zweite für rvalue-Einsen, siehe §20.2.3 / 2):

%Vor%

Ersetzt int , erhalten wir:

%Vor%

Und da nb lvalue ist, wird die erste Version gewählt. Gemäß dem Standardentwurf ist der einzige Effekt von forward static_cast<T&&>(t) . Wenn T int ist, erhalten wir static_cast<int&&>(nb) , d. H. Wir erhalten zwei genau dieselben Umwandlungen.

Wenn Sie jetzt lvalue in rvalue umwandeln möchten (um das Verschieben zu ermöglichen), verwenden Sie bitte nur std::move , was die idiomatische Methode für diese Konvertierung ist. std::forward soll nicht auf diese Weise verwendet werden.

    
Vitus 28.07.2011, 20:18
quelle
1

Kein Unterschied.

Howard Hinnant 28.07.2011 20:17
quelle

Tags und Links