RvalueとLvalue参照
メニューを表示するにはスワイプしてください
lvalue と rvalue の概念は、式を2つのタイプに分類するために使われます。1つはメモリ上の安定した場所を持つもの、もう1つは一時的なものです。
lvalue(左辺値)は、メモリ上の特定の場所を参照する式です。簡単に言えば、名前を持ち、値を変更できる変数です。
int x = 10;
ここで、x は lvalue です。名前があり、メモリ上に存在し、その値を変更できます(x = 20)。
rvalue(右辺値)は、一時的な値であり、独自の名前を持たず、式の評価中だけ存在します。
10
x + 5
int y = x + 5;
ここで、x + 5 は 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 参照に変換し、ムーブセマンティクスおよび所有権の移動をコピーせずに可能にする。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください