Lvalue ja rvalue: ero
Päättele arvokategoriat: lvaluet, prvaluet ja xvaluet.
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 referencervalue-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 rvalueMiksi 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 literalSidontasää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 refMiksi 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.
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
- Lvalue ja rvalue: ero
- Rvalue-viitteet ja &&-syntaksi
- std::move ja std::forward
- Siirtokonstruktorit ja siirtosijoitus