0Pricing
C++ Academy · レッスン

右辺値参照と&&構文

右辺値参照で一時オブジェクトに束縛し、リソースを効率的に移動します。

「右辺値参照と&&構文」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

&&構文

右辺値参照は T&&で宣言します。まもなく破棄される一時オブジェクトである右辺値にのみ束縛されます。

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

右辺値参照を使う理由

引数がまもなく破棄されることを把握している関数を記述できます。そのリソースをコピーせずに取得できます。

参照型による関数オーバーロード

T&と T&&で関数をオーバーロードできます。コンパイラーは引数のカテゴリに基づいて適切な関数を選択します。

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

名前付き右辺値参照は左辺値になる

右辺値参照に名前を付けると、その名前自体が左辺値になります。その同一性が確定するためです。右辺値性を取り戻すには std::moveを使用してください。

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::moveはキャスト

std::move(x)はそれ自体では何も移動しません。これは xを右辺値参照として返す型キャストです。実際のムーブは、受け取るコンストラクターで行われます。

// equivalent to
static_cast<std::string&&>(s)

ムーブと呼ばれる理由

この名前は、内容を奪うことを意図したオブジェクトを渡すという典型的な使い方を表しています。ただし、それ自体で何かを転送するわけではありません。

ユニバーサル参照(転送参照)

推論される Tを持つテンプレートで T&&が現れる場合、それは転送参照です。左辺値と右辺値の両方に束縛され、カテゴリを維持します。

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

参照の折りたたみ

テンプレートによって参照が重なると、言語はそれらを次のように折りたたみます:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

moveを使わない場合

単純コピー可能な型(int、double、ポインター)では、ムーブはコピーと同じです。std::moveを呼び出しても利点はなく、読み手を混乱させる可能性があります。

リソースを所有しない型のムーブ

ヒープリソースを持たない型では、ムーブコンストラクターはコピーコンストラクターと同じです。ムーブが有効なのは、動的メモリを所有する型だけです。

よくある落とし穴:constからのムーブ

constオブジェクトに対する std::moveは何もしません。ムーブコンストラクターはソースを変更する必要があるため、constオブジェクトに対して呼び出すことができません。

確認問題

std::move(x)は実際には何をしますか?

まとめ

T&&は右辺値に束縛されます。名前付き右辺値参照は左辺値になるため、右辺値性を取り戻すには std::moveを使用してください。テンプレート内の T&&は転送参照です。std::moveはキャストであり、それ自体がムーブを実行するわけではありません。

よくある質問

「右辺値参照と&&構文」レッスンは無料ですか?

はい。「右辺値参照と&&構文」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「右辺値参照と&&構文」で何を学びますか?

右辺値参照で一時オブジェクトに束縛し、リソースを効率的に移動します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「右辺値参照と&&構文」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

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