Lvalue a rvalue — różnica
Rozumiej kategorie wartości: lvalue, prvalue i xvalue
Lvalue a rvalue — różnica to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Dwa światy: lvalue i rvalue
Każde wyrażenie w języku C++ jest albo lvalue (obiektem mającym nazwę i adres), albo rvalue (obiektem tymczasowym bez nazwy).
Lvalues
lvalue odnosi się do trwałego obiektu — jego adres można pobrać za pomocą &.
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue referenceRvalues
rvalue jest obiektem tymczasowym — może być literałem, wartością zwracaną przez funkcję albo wyrażeniem takim jak a + b. Nie można pobrać jego adresu.
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvalueDlaczego to rozróżnienie ma znaczenie
Obiekt rvalue wkrótce zostanie zniszczony. Można bezpiecznie przejąć jego zasoby zamiast je kopiować — na tym opiera się semantyka przenoszenia.
Trzy kategorie od C++11
Współczesny C++ uszczegóławia ten model:
- lvalue — ma nazwę i tożsamość
- prvalue (pure rvalue) — czysty obiekt tymczasowy (literał, wartość zwracana przez wartość)
- xvalue (expiring) — obiekt, który wkrótce przestanie istnieć (wynik działania
std::move)
Referencje lvalue i rvalue
referencja lvalue używa &, a referencja rvalue używa &&.
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literalReguły wiązania
Zgodność typów:
- referencja lvalue (
T&) wiąże się z obiektami lvalue - referencja const lvalue (
const T&) wiąże się zarówno z obiektami lvalue, jak i rvalue - referencja rvalue (
T&&) wiąże się tylko z obiektami rvalue (oraz xvalue)
Sprawdzanie za pomocą decltype
Można zapytać kompilator, jaką kategorię ma wyrażenie, używając dla niego decltype.
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refDlaczego w C++11 dodano referencje rvalue
Aby umożliwić semantykę przenoszenia: konstruktor przyjmujący T&& może przejąć wewnętrzne dane obiektu tymczasowego, unikając głębokiego kopiowania.
Częsty błąd: nazwana referencja rvalue jest lvalue
Zmienna będąca referencją rvalue po zadeklarowaniu ma nazwę — przez co staje się lvalue. Aby przekazać ją dalej jako rvalue, należy użyć std::move.
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}Wprowadzenie do perfect forwarding
Szablony przyjmujące T&& mogą wydedukować zarówno referencję lvalue, jak i rvalue. W połączeniu z std::forward mogą zachować kategorię wartości — szczegóły zostaną omówione później.
Szybkie sprawdzenie
Które z tych wyrażeń jest rvalue?
Podsumowanie
Obiekt lvalue ma nazwę i adres, a rvalue jest obiektem tymczasowym. T& wiąże się z obiektami lvalue, a T&& z obiektami rvalue. To rozróżnienie umożliwia semantykę przenoszenia, pozwalając unikać zbędnego kopiowania obiektów tymczasowych.
Często zadawane pytania
Czy lekcja „Lvalue a rvalue — różnica” jest bezpłatna?
Tak — pełny tekst „Lvalue a rvalue — różnica” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Lvalue a rvalue — różnica”?
Rozumiej kategorie wartości: lvalue, prvalue i xvalue Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Lvalue a rvalue — różnica”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Lvalue a rvalue — różnica
- Referencje rvalue i składnia &&
- std::move i std::forward
- Konstruktory przenoszące i przenoszące operatory przypisania