Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Rvalue та Lvalue Посилання | Основи Посилань
Покажчики та Посилання в C++

bookRvalue та Lvalue Посилання

Свайпніть щоб показати меню

Поняття lvalue та rvalue використовуються для класифікації виразів на два типи: ті, що мають стабільне розташування в пам'яті, та ті, що є тимчасовими.

lvalue (ліва величина) — це вираз, який посилається на конкретне місце в пам'яті. Простіше кажучи, це змінна з іменем, яку можна змінювати.

int x = 10;

Тут x є lvalue, оскільки має ім'я, існує в пам'яті, і її значення можна змінити (x = 20).

rvalue (права величина) — це тимчасове значення, яке не має власного імені і існує лише під час обчислення виразу.

10
x + 5

int y = x + 5;

Тут x + 5 є rvalue, оскільки це лише результат обчислення, який не зберігається як окремий об'єкт і не може бути змінений безпосередньо.

Проста ідея:

  • lvalue: об'єкт з іменем і адресою в пам'яті (змінна);
  • rvalue: тимчасовий результат (значення або вираз).

Тимчасові значення

Тимчасове значення — це короткочасний, проміжний результат, створений під час обчислення виразу.

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);

Тимчасові значення автоматично керуються компілятором і існують протягом виразу або операції, у якій вони створені. Після цього вони зазвичай видаляються, а результат зберігається у цільовій змінній або використовується за потреби.

Семантика переміщення

Посилання на rvalue позначається подвійним амперсандом (&&).

Єдина відмінність між посиланням на lvalue та rvalue полягає в тому, що rvalue може бути прив'язане до тимчасового об'єкта, тоді як посилання на lvalue не може.

int&& ref_value = 5 * 5;
Note
Примітка

Використання посилання на rvalue у цьому контексті може бути не дуже доцільним, оскільки немає переваг у використанні rvalue для простого літерала.

Поєднання lvalue та rvalue посилань використовується для підтримки семантики переміщення, що дозволяє передавати ресурси від одного об'єкта до іншого без зайвого копіювання. Розгляньте приклад нижче:

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` }

Але нам не потрібні копії a чи b. Ми просто хотіли їх поміняти місцями. Спробуємо ще раз.

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(): перетворює lvalue на rvalue-посилання, дозволяючи семантику переміщення та передачу права власності без копіювання.

question mark

Що таке lvalue?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 2

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 2
some-alt