Gibt es hier einen Unterschied zwischen move und forward:
%Vor%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:
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.