Warum eine R-Wert-Referenzvariable kein R-Wert ist?
Betrachten wir zwei überladene Funktionen f:
void f(T&&); // Overload #1 void f(T&); // Overload #2
Innerhalb Funktion g:
void g(T&& t) { f(t); // Calls Overload #2 }
Überraschenderweise wird Overload #2 aufgerufen da t als L-Wert betrachtet wird, obwohl die erste Überladung eine R-Wert-Referenzsignatur (T&&) hat.
Wie kann eine R-Wert-Referenzsignatur nicht mit einem Aufruf übereinstimmen, der einen R-Wert übergibt?
C-Regeln für R-Werte verstehen
R-Werte sind im Allgemeinen Variablen ohne Namen, die ihren Namen verlieren in Kürze. T&& t hat den Bezeichner t, ist also ein L-Wert. Dies ist sinnvoll, da R-Werte nur von kurzer Dauer sein sollten und es unmöglich ist, später darauf zu verweisen.
T&& ist jedoch der Typ R-Wert-Referenz. Es kann nur an R-Werte gebunden werden, ohne dass eine statische Umwandlung erforderlich ist, aber es ist immer noch ein L-Wert vom Typ R-Wert-Referenz. Seine R-Wert-Referenznatur ist nur während der Initialisierung und der Decltype-Verwendung von Bedeutung. Andernfalls fungiert es als L-Wert des Referenztyps.
Statische Umwandlung und Referenzerweiterung
std::move(t) gibt eine R-Wert-Referenz zurück, indem eine statische Umwandlung durchgeführt wird auf t. Dadurch kann die Lebensdauer des temporären Werts verlängert werden, wenn er an eine Referenz außerhalb eines Konstruktors gebunden ist.
Der C-Standard definiert explizite Regeln für die Behandlung dieser Szenarien. R-Wert-Referenzen und Konstanten-Referenzen können an R-Werte gebunden werden. Implizite Verschiebungen treten auf, wenn ein benannter Wert von einer Funktion zurückgegeben wird, wenn ein Wert keinen Namen hat oder wenn eine Funktion explizit eine R-Wert-Referenz zurückgibt.
Außerdem ist T&& möglicherweise nicht immer eine R-Wert-Referenz. Wenn T X& oder X const&, Referenzreduzierung konvertiert T&& zu X& oder X const&. Schließlich kann T&& je nach Typ des Arguments als „Weiterleitungsreferenz“ bei der Typableitung fungieren.
Das obige ist der detaillierte Inhalt vonWarum stimmt eine Rvalue-Referenzvariable nicht mit der Signatur einer Rvalue-Referenzfunktion überein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!