Heim >Backend-Entwicklung >C++ >Warum verhält sich „T&&' nicht immer wie eine echte R-Wert-Referenz?

Warum verhält sich „T&&' nicht immer wie eine echte R-Wert-Referenz?

Linda Hamilton
Linda HamiltonOriginal
2024-11-30 06:21:15397Durchsuche

Why Doesn't `T&&` Always Behave Like a True Rvalue Reference?

Warum verhält sich T&& nicht wie eine R-Wert-Referenz?

Bei der Arbeit mit Funktionsüberladungen wie void f(T&&) und void f(T& ), ist es überraschend, dass f(T&) aufgerufen wird, wenn T&& übergeben wird, auch wenn das Gegenteil nicht der Fall ist. Dies ist auf das Verhalten von R-Wert-Referenzen in C zurückzuführen.

Entgegen der Intuition ist T&& nicht einfach eine R-Wert-Referenz. Es handelt sich um eine R-Wert-Referenz vom Typ Rvalue, was bedeutet, dass sie nur an R-Werte gebunden werden kann, sich ansonsten aber wie ein L-Wert vom R-Wert-Referenztyp verhält. Dieses Bindungsverhalten stellt sicher, dass Objekte ohne Namen und solche, die kurz davor stehen, ihren Namen zu verlieren, automatisch als R-Werte behandelt werden.

Da T&& jedoch einen Namen (d. h. t) hat, wird es als L-Wert betrachtet und ruft daher den f( T&) Überlastung. Die statische Umwandlung von t in T&&& unter Verwendung von f(static_cast(t)) ist erforderlich, um die R-Wert-Referenzüberladung f(T&&) aufzurufen.

Zusammenfassend lauten die C-Regeln, die dieses Verhalten regeln:

  • Implizite Verschiebungen treten auf, wenn benannte Werte von Funktionen zurückgegeben werden, wenn Werte keine Namen haben oder wenn Funktionen explizit R-Werte zurückgeben Referenzen.
  • Nur ​​R-Wert-Referenzen und const& können an R-Werte gebunden werden.
  • Die Verlängerung der Referenzlebensdauer auf temporäre Werte erfolgt, wenn sie direkt an eine Referenz außerhalb eines Konstruktors gebunden werden, und gilt für R-Wert-Referenzen und const&.
  • T&& ist nicht immer eine wertvolle Referenz; es kann je nach Typ von T zu X&, X const& oder 🎜>

Das obige ist der detaillierte Inhalt vonWarum verhält sich „T&&' nicht immer wie eine echte R-Wert-Referenz?. 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