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
Linda HamiltonOriginal
2024-12-07 21:48:18919Durchsuche

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

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(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!

Stellungnahme:
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