0Pricing
C++ Academy · レッスン

左辺値と右辺値の違い

値カテゴリーである左辺値、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 ref

C++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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 左辺値と右辺値の違い
  2. 右辺値参照と&&構文
  3. std::moveとstd::forward
  4. ムーブコンストラクターとムーブ代入
← C++ Academyに戻る