Heim > Backend-Entwicklung > C++ > Wann kann ein R-Wert-Referenzparameter an ein L-Wert-Argument in C gebunden werden?

Wann kann ein R-Wert-Referenzparameter an ein L-Wert-Argument in C gebunden werden?

Linda Hamilton
Freigeben: 2024-12-07 21:48:18
Original
895 Leute haben es durchsucht

When Can an Rvalue Reference Parameter Bind to an Lvalue Argument in C  ?

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
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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(t) durchgeführt wird.

The Relevant Regeln:

  • Eine implizite Verschiebung zu einem R-Wert-Referenzparameter erfolgt, wenn ein benannter Wert von einer Funktion zurückgegeben wird oder wenn der Wert keinen Namen hat.
  • Nur ​​R-Wert Referenzen und const& können an R-Werte gebunden werden.
  • R-Wert-Referenzen und const& unterliegen einer Lebensverlängerung, wenn sie direkt an eine externe Referenz gebunden sind eines Konstruktors.
  • Referenzkollabierung transformiert T&& in X& oder X const&, wenn T vom Typ X& oder , oder X const&& basierend auf dem Argumenttyp.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage