0Pricing
C++ Academy · Lekcja

Referencje rvalue i składnia &&

Dowiązuj się do obiektów tymczasowych za pomocą referencji rvalue, aby wydajnie przenosić zasoby

Referencje rvalue i składnia && to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 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.

Składnia &&

Referencję rvalue deklaruje się za pomocą T&&. Wiąże się ona tylko z obiektami rvalue — obiektami tymczasowymi, które wkrótce zostaną zniszczone.

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

Po co stosować referencje rvalue?

Pozwalają pisać funkcje, które wiedzą, że argument wkrótce zostanie zniszczony. Można przejąć jego zasoby bez tworzenia kopii.

Przeciążanie funkcji według typu referencji

Funkcję można przeciążyć dla T& i T&&. Kompilator wybiera właściwą wersję na podstawie kategorii argumentu.

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

Nazwane referencje rvalue stają się lvalue

Po nadaniu referencji rvalue nazwy sama ta nazwa jest lvalue — jej tożsamość została ustalona. Aby ponownie uzyskać rvalue, należy użyć std::move.

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::move jest rzutowaniem

std::move(x) samo w sobie niczego nie przenosi — jest rzutowaniem typu, które zwraca x jako referencję rvalue. Właściwe przenoszenie następuje w konstruktorze odbierającym obiekt.

// equivalent to
static_cast<std::string&&>(s)

Dlaczego nazywa się to przenoszeniem

Nazwa odzwierciedla typowe zastosowanie — przekazywanie obiektu, którego zawartość ma zostać przejęta — ale samo wywołanie nie przenosi niczego.

Referencje uniwersalne (referencje przekazujące)

Gdy T&& występuje w szablonie z wydedukowanym T, jest referencją przekazującą — wiąże się zarówno z obiektami lvalue, jak i rvalue, zachowując ich kategorię.

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

Redukowanie referencji

Gdy referencje nakładają się na siebie za pośrednictwem szablonów, język je redukuje:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

Kiedy nie używać move

W przypadku typów kopiowalnych w sposób trywialny (int, double, wskaźnik) przenoszenie jest tym samym co kopiowanie. Wywołanie std::move nie przynosi żadnej korzyści i może wprowadzać czytelnika w błąd.

Przenoszenie bez przejmowania zasobów

W przypadku typów, które nie korzystają z zasobów na stercie, konstruktor przenoszący jest taki sam jak konstruktor kopiujący. Przenoszenie przynosi korzyści tylko w przypadku typów będących właścicielami pamięci dynamicznej.

Częsta pułapka: przenoszenie z const

std::move zastosowane do obiektu const nic nie robi — nie można wywołać konstruktora przenoszącego dla obiektu const, ponieważ wymagałoby to zmodyfikowania źródła.

Szybkie sprawdzenie

Co właściwie robi std::move(x)?

Podsumowanie

T&& wiąże się z obiektami rvalue. Nazwane referencje rvalue stają się lvalue — aby odzyskać rvalue, należy użyć std::move. T&& w szablonie jest referencją przekazującą. std::move jest rzutowaniem — samo nie wykonuje przenoszenia.

Często zadawane pytania

Czy lekcja „Referencje rvalue i składnia &&” jest bezpłatna?

Tak — pełny tekst „Referencje rvalue i składnia &&” 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 „Referencje rvalue i składnia &&”?

Dowiązuj się do obiektów tymczasowych za pomocą referencji rvalue, aby wydajnie przenosić zasoby Ć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 2 z 4.

Ile czasu zajmuje lekcja „Referencje rvalue i składnia &&”?

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