Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Rvalue- und Lvalue-Referenzen | Section
C++-Zeiger und Referenzen

bookRvalue- und Lvalue-Referenzen

Swipe um das Menü anzuzeigen

Die Konzepte lvalue und rvalue beziehen sich auf die Klassifizierung von Ausdrücken.

  • lvalue oder Left Value: Ein Ausdruck, der sich auf ein Objekt mit identifizierbarem Speicherort bezieht. Stellt ein Objekt dar, das verändert werden kann;

  • rvalue oder Right Value: Ein Ausdruck, der einen temporären oder wegwerfbaren Wert darstellt.

Temporäre Werte

Ein temporärer Wert ist ein kurzlebiges, intermediäres Ergebnis, das während der Auswertung eines Ausdrucks erzeugt wird.

rvalue.h

rvalue.h

copy
12345678
// `(27 + 6 + 3 + 2)` is a tempopary value int sum = 27 + 6 + 3 + 2; // `static_cast<float>(sum)` is a tempopary value float avarage = static_cast<float>(sum) / count; // std::max(7, 9) will return a tempopary value int largest = std::max(7, 9);

Temporäre Werte werden automatisch vom Compiler verwaltet und existieren für die Dauer des Ausdrucks oder der Operation, in der sie erstellt werden. Danach werden sie in der Regel verworfen, und das Ergebnis wird in der Zielvariablen gespeichert oder nach Bedarf verwendet.

Move-Semantik

Ein Rvalue-Referenz wird durch das doppelte kaufmännische Und-Zeichen (&&) dargestellt.

Der einzige Unterschied zwischen einer Lvalue- und einer Rvalue-Referenz besteht darin, dass eine Rvalue-Referenz an ein temporäres Objekt gebunden werden kann, während eine Lvalue-Referenz dies nicht kann.

int&& ref_value = 5 * 5;
Note
Hinweis

Die Verwendung einer Rvalue-Referenz in diesem Zusammenhang ist möglicherweise nicht sehr sinnvoll, da es keinen Vorteil bringt, eine Rvalue-Referenz für ein einfaches Literal zu verwenden.

Eine Kombination aus lvalue- und rvalue-Referenzen wird verwendet, um Move-Semantik zu unterstützen. Dadurch können Ressourcen von einem Objekt auf ein anderes übertragen werden, ohne unnötiges Kopieren. Siehe das folgende Beispiel:

swap.h

swap.h

copy
123456
std::string swap(std::string& a, std::string& b) { std::string tmp(a); // We have two copies of string `a` a = b; // Now we have two copies of string `b` b = tmp; // And now we have two copies of string `tmp` }

Aber wir benötigen keine Kopien von a oder b. Wir wollten sie einfach nur tauschen. Versuchen wir es erneut.

main.cpp

main.cpp

copy
1234567891011121314151617181920212223
#include <iostream> void swap(std::string &a, std::string &b) { // Move the content of a into temp std::string temp(std::move(a)); // Move the content of b into a a = std::move(b); // Move the content of temp into b b = std::move(temp); } int main() { std::string a = "Hello\n"; std::string b = "Bye\n"; swap(a, b); std::cout << a << b; }

std::move(): wandelt ein Lvalue in eine Rvalue-Referenz um, ermöglicht Move-Semantik und die Übertragung des Besitzes ohne Kopieren.

question mark

Was ist ein Lvalue?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 10

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 1. Kapitel 10
some-alt