Heim > Backend-Entwicklung > C++ > Warum stimmt eine Rvalue-Referenzvariable nicht mit der Signatur einer Rvalue-Referenzfunktion überein?

Warum stimmt eine Rvalue-Referenzvariable nicht mit der Signatur einer Rvalue-Referenzfunktion überein?

Mary-Kate Olsen
Freigeben: 2024-12-10 22:46:11
Original
801 Leute haben es durchsucht

Why Doesn't an Rvalue Reference Variable Match an Rvalue Reference Function Signature?

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

Innerhalb Funktion g:

void g(T&& t) { 
  f(t);  // Calls Overload #2
}
Nach dem Login kopieren

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

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