0Pricing
C++ Academy · Lekcja

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 reference

Rvalues

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 rvalue

Dlaczego 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 literal

Reguł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 ref

Dlaczego 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

  1. Lvalue a rvalue — różnica
  2. Referencje rvalue i składnia &&
  3. std::move i std::forward
  4. Konstruktory przenoszące i przenoszące operatory przypisania
← Powrót do C++ Academy