左辺値と右辺値の違い
値カテゴリーである左辺値、prvalue、xvalueについて考えます。
「左辺値と右辺値の違い」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
2つの世界:左辺値と右辺値
C++のすべての式は、左辺値(名前とアドレスを持つもの)か、右辺値(名前を持たない一時オブジェクト)のいずれかです。
左辺値
左辺値は存続するオブジェクトを指します。&でそのアドレスを取得できます。
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue reference右辺値
右辺値は一時オブジェクトです。リテラル、関数の戻り値、a + bのような式が該当します。アドレスを取得することはできません。
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvalue区別が重要な理由
右辺値はまもなく破棄されます。そのため、コピーする代わりにリソースを安全に奪うことができます。これがムーブセマンティクスの基礎です。
C++11以降の3つのカテゴリ
現在のC++では、このモデルがさらに細分化されています:
- 左辺値 — 名前と同一性を持つ
- prvalue(純粋右辺値) — 純粋な一時オブジェクト(リテラル、値を返す戻り値)
- xvalue(期限切れ値) — まもなく破棄されるもの(
std::moveの結果)
左辺値参照と右辺値参照
左辺値参照には &を使用し、右辺値参照には &&を使用します。
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literal束縛の規則
型の互換性:
- 左辺値参照(
T&)は左辺値に束縛されます - const左辺値参照(
const T&)は両方に束縛されます - 右辺値参照(
T&&)は右辺値(およびxvalue)にのみ束縛されます
decltypeによる確認
式に decltypeを使用すると、その式のカテゴリをコンパイラーに確認できます。
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refC++11で右辺値参照が追加された理由
ムーブセマンティクスを実現するためです。T&&を受け取るコンストラクターは、一時オブジェクトの内部データの所有権を取得し、ディープコピーを避けられます。
よくある間違い:名前付き右辺値参照は左辺値
右辺値参照変数は、いったん宣言されると名前を持つため、左辺値になります。右辺値として渡すには std::moveを使用してください。
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}完全転送の概要
T&&を受け取るテンプレートでは、左辺値参照または右辺値参照のいずれかが推論されます。std::forwardと組み合わせることで、値カテゴリを維持できます。詳しくは後で説明します。
確認問題
次の式のうち、右辺値なのはどれですか?
まとめ
左辺値は名前とアドレスを持ち、右辺値は一時オブジェクトです。T&は左辺値に、T&&は右辺値に束縛されます。この区別によってムーブセマンティクスが可能になり、一時オブジェクトの不要なコピーを避けられます。
よくある質問
「左辺値と右辺値の違い」レッスンは無料ですか?
はい。「左辺値と右辺値の違い」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「左辺値と右辺値の違い」で何を学びますか?
値カテゴリーである左辺値、prvalue、xvalueについて考えます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「左辺値と右辺値の違い」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。