Rvalue- та Lvalue-посилання
Свайпніть щоб показати меню
Поняття lvalue та rvalue пов'язані з класифікацією виразів.
-
lvalueабо ліва частина: вираз, що посилається на об'єкт з визначеним розташуванням у пам'яті. Представляє об'єкт, який можна змінювати; -
rvalueабо права частина: вираз, що представляє тимчасове або одноразове значення.
Тимчасові значення
Тимчасове значення — це короткочасний, проміжний результат, створений під час обчислення виразу.
rvalue.h
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;
Використання посилання на rvalue у цьому контексті може бути не дуже практичним, оскільки немає переваг у використанні rvalue для простого літерала.
Поєднання lvalue та rvalue посилань використовується для підтримки семантики переміщення, що дозволяє передавати ресурси від одного об'єкта до іншого без зайвого копіювання. Розгляньте приклад нижче:
swap.h
123456std::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
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-посилання, дозволяючи семантику переміщення та передачу права власності без копіювання.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат