Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Rvalue- och Lvalue-referenser | Sektion
C++-Pekare och Referenser

bookRvalue- och Lvalue-referenser

Svep för att visa menyn

Begreppen lvalue och rvalue är relaterade till klassificeringen av uttryck.

  • lvalue eller vänstervärde: är ett uttryck som refererar till ett objekt med identifierbar minnesplats. Det representerar ett objekt som kan modifieras;

  • rvalue eller högervärde: är ett uttryck som representerar ett temporärt eller engångsvärde.

Temporära värden

Ett temporärt värde är ett kortlivat, intermediärt resultat som skapas under utvärderingen av ett uttryck.

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ära värden hanteras automatiskt av kompilatorn och existerar under uttryckets eller operationens varaktighet där de skapas. Därefter kasseras de vanligtvis, och resultatet lagras i målvariabeln eller används efter behov.

Flyttsemantik

En rvalue-referens anges med dubbla et-tecken (&&).

Den enda skillnaden mellan en lvalue- och en rvalue-referens är att en rvalue kan bindas till ett temporärt objekt, medan en lvalue-referens inte kan det.

int&& ref_value = 5 * 5;
Note
Notera

Att använda en rvalue-referens i detta sammanhang är kanske inte särskilt praktiskt, eftersom det inte finns någon fördel med att använda en rvalue-referens för ett enkelt literalvärde.

En kombination av lvalue- och rvalue-referenser används för att stödja move-semantik, vilket möjliggör överföring av resurser från ett objekt till ett annat utan onödig kopiering. Se exemplet nedan:

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` }

Men vi behöver inga kopior av a eller b. Vi ville helt enkelt byta plats på dem. Låt oss försöka igen.

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(): omvandlar en lvalue till en rvalue-referens, möjliggör flyttsemantik och överföring av ägarskap utan kopiering.

question mark

Vad är en lvalue?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 10

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 1. Kapitel 10
some-alt