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

bookRvalue- та Lvalue-посилання

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

Поняття lvalue та 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?

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

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

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

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

Секція 1. Розділ 10

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Секція 1. Розділ 10
some-alt