Wenn ich Effective Modern C++ by Scott Meyer darüber gelesen habe, wie die Funktion std :: forward funktioniert, habe ich eine Frage, die ich nicht ganz verstehe. Sprich, wenn wir eine Funktion foo
haben wie folgt:C++ Übergabe von Rvalue-Referenz an Funktionen, die Lvalue-Referenz
template<typename T>
void foo(T&& fooParam)
{
...
someFunc(std::forward<T>(fooParam));
}
In dem Buch erklärt Scott, dass die std::forward<T>
in der folgenden Art und Weise umgesetzt werden könnte:
template<typename T>
T&& forward(typename remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}
das Argument foo
gibt Angenommen ist ein R-Wert vom Typ Widget
. Dann wird die std::forward
Funktionsvorlage würde wie folgt initialisiert werden:
Widget&& forward(Widget& param)
{ return static_cast<Widget&&>(param); }
Also meine Frage ist, wenn fooParam
(die vom Typ Widget &&
) weitergegeben std::forward
, wie könnte die Funktion, die einen Parameter vom Typ Widget& param
Match nimmt fooParam
? Ich weiß, fooParam
selbst ist ein Lvalue. Aber sein Typ ist immer noch rvalue Referenz (Widget &&
) oder? Wie können sie zueinander passen?
Wenn eine Funktion, die einen Parameter des Lvalue-Referenztyps akzeptiert, mit einer Rvalue-Referenz übergeben werden könnte, könnte diese Funktion sogar den übergebenen Rvalue modifizieren (wie ein temporäres Objekt). Das macht keinen Sinn für mich machen ...
Es ist die Anruferseite, die mit der Implikation der Weitergabe von Rvales betroffen sein sollte. Wenn rvalue an eine Funktion übergeben wird, sollte der Aufrufer der Funktion sie nicht weiter verwenden. Die Funktion, die den R-Wert empfängt, sieht den Parameter jedoch nur als normalen Wert. – sameerkn