Warum ist std :: forward in diesem Kontext nutzlos?

8

Es ist mir aufgefallen, dass std::forward in diesem Zusammenhang nutzlos ist:

%Vor%

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?

    
Dean 30.11.2015, 13:16
quelle

1 Antwort

13

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

[Live]

    
Angew 30.11.2015, 13:29
quelle

Tags und Links