C++ Academy · Oppitunti

Lvalue ja rvalue: ero

Päättele arvokategoriat: lvaluet, prvaluet ja xvaluet.

Oppitunti 1/413 vaihetta

Lvalue ja rvalue: ero on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Kaksi maailmaa: lvalue ja rvalue

Jokainen C++:n lauseke on joko lvalue (nimetty olio, jolla on osoite) tai rvalue (väliaikainen olio, jolla ei ole nimeä).

lvalue-arvot

lvalue viittaa säilyvään olioon — sen osoitteen voi ottaa &-operaattorilla.

int x = 42;           // x is an lvalue
int* p = &x;          // taking the address of an lvalue

int& r = x;           // r is an lvalue reference

rvalue-arvot

rvalue on väliaikainen olio — esimerkiksi literaali, funktion paluuarvo tai lauseke kuten a + b. Sen osoitetta ei voi ottaa.

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

Miksi erottelu on tärkeä

rvalue ollaan kohta tuhoamassa. Sen resurssit voidaan turvallisesti varastaa kopioimisen sijaan — tämä on siirtosemanttiikan perusta.

Kolme luokkaa C++11:stä lähtien

Moderni C++ täsmentää mallia:

  • lvalue — sillä on nimi ja identiteetti
  • prvalue (puhdas rvalue) — puhtaasti väliaikainen olio (literaali tai arvona palautettava tulos)
  • xvalue (vanheneva arvo) — juuri tuhoutumassa (std::move-kutsun tulos)

lvalue- ja rvalue-viittaukset

lvalue-viittaus käyttää &-merkintää; rvalue-viittaus käyttää &&-merkintää.

int x = 10;
int&  lr = x;        // lvalue reference
int&& rr = 42;       // rvalue reference, binds to literal

Sidontasäännöt

Tyypin yhteensopivuus:

  • lvalue-viittaus (T&) sitoutuu lvalue-arvoihin
  • const lvalue -viittaus (const T&) sitoutuu molempiin
  • rvalue-viittaus (T&&) sitoutuu vain rvalue-arvoihin (ja xvalue-arvoihin)

Tarkistaminen decltype-määritteellä

Kääntäjältä voi kysyä lausekkeen arvokategorian käyttämällä siihen decltype-määritettä.

int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue ref

Miksi C++11 lisäsi rvalue-viittaukset

Siirtosemantiikan mahdollistamiseksi: T&&-parametrin vastaanottava rakentaja voi ottaa väliaikaisen olion sisäisen datan omistukseensa ja välttää syvän kopion.

Yleinen virhe: nimetty rvalue-viittaus on lvalue

Kun rvalue-viittausmuuttuja on julistettu, sillä on nimi — joten se on lvalue. Välittääksenne sen eteenpäin rvalue-arvona käyttäkää std::move-funktiota.

void f(std::string&& s) {
    // s here is an lvalue!
    process(std::move(s));   // now it is an rvalue again
}

Täydellisen välityksen esikatselu

T&&-parametrin vastaanottavat mallifunktiot päättelevät joko lvalue- tai rvalue-viittauksen. Yhdessä std::forward-funktion kanssa ne voivat säilyttää arvokategorian — tätä käsitellään myöhemmin tarkemmin.

Pikatarkistus

Mikä näistä lausekkeista on rvalue-arvo?

Kertaus

lvalue-arvolla on nimi ja osoite; rvalue-arvo on väliaikainen. T& sitoutuu lvalue-arvoihin ja T&& rvalue-arvoihin. Tämä erottelu mahdollistaa siirtosemantiikan ja väliaikaisten olioiden tarpeettomien kopioiden välttämisen.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Lvalue ja rvalue: ero” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Lvalue ja rvalue: ero”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Lvalue ja rvalue: ero”?

Päättele arvokategoriat: lvaluet, prvaluet ja xvaluet. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Lvalue ja rvalue: ero”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Lvalue ja rvalue: ero
  2. Rvalue-viitteet ja &&-syntaksi
  3. std::move ja std::forward
  4. Siirtokonstruktorit ja siirtosijoitus
← Takaisin: C++ Academy