C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の「&&」とは?右辺値参照の意味と使い方をわかりやすく解説

&&(ダブルアンパサンド)は、C++11で新たに導入された参照演算子です。int&& a のように記述した場合、変数「a」が右辺値参照(r-value reference)であることを意味します。&&は通常、関数の引数(パラメータ)の宣言に使われることが多く、その場合、右辺値の式のみを受け取ることができます。

右辺値と左辺値の違いとは?

簡単に言うと、右辺値(r-value)とはメモリ上の明確なアドレスを持たない一時的な値のことです。

  • 数値の 6 や文字 'v' → どちらも右辺値
  • int a; と宣言したときの a → 左辺値(l-value)
  • (a + 2) → 計算結果として生成される一時的な値なので右辺値

このように、名前を持つ変数は左辺値、名前を持たず一時的に存在する値は右辺値と考えると理解しやすくなります。

コード例で確認する

#include <iostream>

void foo(int&& a)
{
    // 何か特別な処理...
}

int main()
{
    int b;
    foo(b);      // エラー:右辺値参照は左辺値を直接受け取れない
    foo(5);      // OK:5は右辺値なので問題なくコンパイルできる
    foo(b + 3);  // OK:計算結果は一時的な右辺値なので有効

    int&& c = b; // エラー:右辺値参照は左辺値を直接受け取れない
    int&& d = 5; // OK:5は右辺値なので有効
    return 0;
}

この例からもわかるように、右辺値参照には左辺値を直接代入することはできません。ただし、std::move(b) を使えば左辺値を明示的に右辺値へキャストして渡すことも可能です。

補足:ムーブセマンティクスとの関係

右辺値参照が導入された最大の目的は、ムーブセマンティクス(move semantics)を実現することです。これにより、一時オブジェクトの不要なコピーを避け、リソースの所有権を「ムーブ(移動)」できるようになり、プログラムのパフォーマンスが大幅に向上します。標準ライブラリのコンテナ(std::vector など)もこの仕組みに対応しており、現代のC++開発では欠かせない機能となっています。

まとめ

  • &&はC++11で追加された右辺値参照を表す演算子
  • 右辺値参照は右辺値のみを受け取れる
  • 主にムーブセマンティクスの実現に活用される

右辺値やこの演算子についてさらに詳しく知りたい場合は、MSDNブログの解説記事(Rvalue References: C++0x Features in VC10, Part 2)も参考になるので、ぜひチェックしてみてください。

  1. C++のsizeof演算子とは?基本構文と使い方を実例付きで解説

    sizeof はC++のキーワードであると同時に、コンパイル時に評価される演算子でもあります。変数やデータ型が必要とするメモリのサイズをバイト単位で取得するために使用され、プログラムの実行時ではなくコンパイルの時点でその値が確定する点が特徴です。sizeof演算子は、int や double などの組み込み型だけでなく、クラス・構造体・共用体などユーザー定義のデータ型に対しても使用できます。sizeofの基本構文sizeof (data type)「data type」の部分には、サイズを調べたいデータ型や変数名を指定します。例えば、char 型のオブジェクトに適用した場合は必ず 1 を返しま

  2. C#のキャスト演算子とは?明示的な型変換の基本をわかりやすく解説

    プログラミングにおける型変換(タイプコンバージョン)とは、あるデータ型を別のデータ型に変換することを指します。中でも明示的な変換(明示的キャスト)は、開発者が事前に定義された機能を使って意図的に行う変換であり、この際に必要となるのがキャスト演算子「( )」です。 C#では、double型からint型への変換のように、データ損失が発生する可能性がある変換は自動的に行われません。そのため、開発者が明示的にキャストを記述する必要があります。 double型をint型にキャストするサンプルコード 以下は、double型の値をint型へキャストする具体的な例です。 using System; name