Warum ein R-Wert-Referenzparameter an ein L-Wert-Argument gebunden werden kann
In C wird erwartet, dass R-Wert-Referenzen an R-Werte gebunden werden. Es gibt jedoch Fälle, in denen ein R-Wert-Referenzparameter mit einem L-Wert-Argument übereinstimmen kann, was viele Programmierer überrascht.
Betrachten Sie den folgenden Code:
void f(T&&); // #1 void f(T&); // #2
Normalerweise würden wir das f(T&&) erwarten. Überladung, die beim Übergeben eines R-Werts aufgerufen werden soll, und f(T&)-Überladung für L-Werte. Das Verhalten ist jedoch anders:
void g(T&& t) { f(t); // calls #2 }
In diesem Beispiel wird die f(T&)-Überladung aufgerufen, obwohl t ein R-Wert ist. Dies geschieht, weil t trotz seines R-Wert-Referenztyps immer noch als L-Wert betrachtet wird.
Die Begründung:
R-Werte sind typischerweise Entitäten ohne Namen oder solche, die ihren Namen verlieren Namen in Kürze. R-Wert-Referenzen können nur an R-Werte gebunden werden. Allerdings hat t einen Namen und seine Lebensdauer läuft nicht sofort ab.
Der Typ T&&:
T&& ist der Typ einer R-Wert-Referenz. Obwohl es nur an R-Werte gebunden werden kann, verhält es sich ansonsten wie ein L-Wert vom Typ R-Wert-Referenz. Seine R-Wert-Referenznatur ist nur während seiner Konstruktion und bei der Ausführung von decltype(variable_name) von Bedeutung.
Die Rolle von std::move():
std::move( ) gibt eine R-Wert-Referenz zurück, indem ein static_cast
The Relevant Regeln:
Das obige ist der detaillierte Inhalt vonWann kann ein R-Wert-Referenzparameter an ein L-Wert-Argument in C gebunden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!