Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Rvalue- ja Lvalue-viittaukset | Section
C++-Osoittimet ja Viittaukset

bookRvalue- ja Lvalue-viittaukset

Pyyhkäise näyttääksesi valikon

Käsitteet lvalue ja rvalue liittyvät lausekkeiden luokitteluun.

  • lvalue eli vasemmanpuoleinen arvo: on lauseke, joka viittaa objektiin, jolla on tunnistettava muistipaikka. Edustaa objektia, jota voidaan muokata;

  • rvalue eli oikeanpuoleinen arvo: on lauseke, joka edustaa väliaikaista tai kertakäyttöistä arvoa.

Väliaikaiset arvot

Väliaikainen arvo on lyhytikäinen, välituloksena syntyvä arvo lausekkeen arvioinnin aikana.

rvalue.h

rvalue.h

copy
12345678
// `(27 + 6 + 3 + 2)` is a tempopary value int sum = 27 + 6 + 3 + 2; // `static_cast<float>(sum)` is a tempopary value float avarage = static_cast<float>(sum) / count; // std::max(7, 9) will return a tempopary value int largest = std::max(7, 9);

Väliaikaiset arvot hallitaan automaattisesti kääntäjän toimesta, ja ne ovat olemassa vain sen lausekkeen tai operaation ajan, jossa ne luodaan. Tämän jälkeen ne yleensä poistetaan, ja tulos tallennetaan kohdemuuttujaan tai käytetään tarpeen mukaan.

Siirtosemanttiikka

Rvalue-viittaus merkitään kaksois-et-merkinnällä (&&).

Ainoa ero lvalue- ja rvalue-viittauksen välillä on, että rvalue voidaan sitoa väliaikaiseen olioon, kun taas lvalue-viittausta ei voida.

int&& ref_value = 5 * 5;
Note
Huomio

Rvalue-viittauksen käyttäminen tässä yhteydessä ei ole kovin käytännöllistä, koska yksinkertaiselle literaalille ei ole hyötyä käyttää rvalue-viittausta.

Lvalue- ja rvalue-viittausten yhdistelmää käytetään tukemaan siirtosemanttiikkaa, mikä mahdollistaa resurssien siirtämisen objektista toiseen ilman turhaa kopiointia. Katso alla oleva esimerkki:

swap.h

swap.h

copy
123456
std::string swap(std::string& a, std::string& b) { std::string tmp(a); // We have two copies of string `a` a = b; // Now we have two copies of string `b` b = tmp; // And now we have two copies of string `tmp` }

Mutta emme tarvitse kopioita muuttujista a tai b. Halusimme vain vaihtaa niiden arvot keskenään. Yritetään uudelleen.

main.cpp

main.cpp

copy
1234567891011121314151617181920212223
#include <iostream> void swap(std::string &a, std::string &b) { // Move the content of a into temp std::string temp(std::move(a)); // Move the content of b into a a = std::move(b); // Move the content of temp into b b = std::move(temp); } int main() { std::string a = "Hello\n"; std::string b = "Bye\n"; swap(a, b); std::cout << a << b; }

std::move(): muuntaa lvalue-viitteen rvalue-viitteeksi, mahdollistaa siirtosemanttiikan ja omistajuuden siirron ilman kopiointia.

question mark

Mikä on lvalue?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 10

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 10
some-alt