Es ist mir aufgefallen, dass std::forward
in diesem Zusammenhang nutzlos ist:
Warum ist das? Ich dachte, dass zu der Zeit, wenn eine Rvalue-Referenz an einen Funktionsparameter bindet (dh ich kann sie mit dem Namen referenzieren), wird sie zu einem Lvalue in diesem Bereich und muss, um weitergeleitet zu werden, an eine Rvalue-Referenz übergeben werden (wie in perfekter Weiterleitung) ).
Warum ist es falsch / nutzlos?
Es ist nicht falsch zu verwenden std::forward
hier (per se), aber es ist nicht angebracht und somit irreführend (in diesem Sinne könnte man sagen, dass es ist eigentlich falsch).
Die Art, wie Sie "etwas in einen rvalue-Verweis auf seinen Typ umsetzen" buchstabieren, lautet std::move
. Das ist die einzige Sache, die std::move
macht - es ist eine static_cast<T&&>
, wo du T
nicht buchstabieren musst.
std::forward
ist ein anderes Tier, für die Verwendung mit perfekter Weiterleitung. Perfect Forwarding tritt nur in Vorlagen, wobei Forwarding Referenzen ist möglich. Eine Weiterleitungsreferenz ist eine Referenz, die dank einer speziellen Regel in der Sprache entweder auf eine L-Referenz oder eine R-Referenz verweisen kann. Dort benötigen Sie std::forward<T>
, um die entsprechende Wertkategorie (lvalue oder rvalue) wiederherzustellen.
Spielzeugbeispiel:
%Vor%Die Ausgabe ist:
Lvalue
Rvalue
Rvalue
Tags und Links c++