C++ --rvalue リファレンス

1. 右辺値参照とは何ですか

C++11 より前では、右辺値参照はなく、左辺値参照のみでした。C++11 では、右辺値参照が更新されました。左辺値参照であっても右ポインタであっても、その本質はオブジェクトを作成することです。

左辺値はデータ (変数名や逆参照ポインタなど) を表す式であり、そのアドレスを取得して値を割り当てることができます。左辺値は代入記号の左側に表示できますが、右辺値は代入記号の左側に表示できません。代入記号の左側。定義時の const 修飾子の後の lvalue には値を割り当てることはできませんが、そのアドレスは取得できます。左辺値参照は、左辺値の別名となる左辺値への参照です。

例えば:

     //左参照
    int a = 10;
    int& b = a;
    cout << a << " " << b << endl;

右辺値は、リテラル定数、式の戻り値、関数の戻り値 (左辺値
参照。ただし、代入記号の左側に現れることはできません。右辺値は
アドレスを取ることができません。右辺値参照は、右辺値への参照であり、右辺値にエイリアスが付けられます。

例えば:

    //右值参照
    10;
    int&& a = 10;
    int x = 10;
    int y = 20;
    x + y;
    int&& z = x + y;
    cout << a << endl;
    cout << z << endl;

右辺値のアドレスは取得できないことに注意してください。ただし、右辺値に別名が与えられた後、右辺値は特定の場所に格納され、その場所のアドレスを取得
できるよう例: リテラル値 10 は取得できません。a のアドレスは取得できません。ただし、a が参照された後は、a のアドレスを取得でき、a を変更することもできます。a を変更したくない場合は、 const int&& a を使用してそれを参照できます。素晴らしいと思いませんか? これは右辺値参照の実際の使用法を理解する場合には当てはまらず、この機能は重要ではありません。


2. 左辺値参照と右辺値参照の比較

1. 左辺値参照は右辺値を参照できませんが、const を追加すると参照できます。つまり、const 左辺値参照は左辺値または右辺値を参照できます。

2. 右辺値参照は左辺値を参照できませんが、移動後の右辺値参照は左辺値を参照できます。

例えば:

    int a = 10;
    int& b = a;
    20;
    //左辺値参照
    const int& c = 20;
    //右辺値参照
    int&& d = move(a);
    cout << c << " " << d << endl ;

3. 利用シーン

左辺値参照の欠点: 関数によって返されるオブジェクトがローカル変数である場合、そのオブジェクトは関数のスコープ外に存在しないため、左辺値参照によって返すことはできず、値によってのみ返すことができます。例: bit::string to_string(int value) 関数でわかるように、ここでは値による戻りのみが使用でき、値による戻りでは少なくとも 1 つのコピー構築が発生します (古いコンパイラの場合は、 2 つのコピー構造である必要があります)。

右辺値参照は、効率を向上させるために戻り値およびパラメータとして使用できます。bit::string に移動構築を追加すると、移動構築の本質はパラメータの右辺値のリソースを盗むことです。プレースホルダがすでに存在する場合は、そこにありますディープコピーを行う必要がないため、モバイル構築と呼ばれます。これは、他人のリソースを盗んで自分自身を構築することを意味します。bit::string クラスに移動代入関数を追加し、 bit::to_string(1234) を呼び出します。ただし、今回は bit::to_string(1234) によって返された右辺値オブジェクトを ret1 オブジェクトに割り当ててから、Mobile 構築を呼び出します。 。

文法によれば、右辺値参照は右辺値のみを参照できますが、右辺値参照は左辺値を参照してはなりませんか? 理由: 一部のシナリオでは、移動セマンティクスを実現するために、右辺値を使用して左辺値を参照することが実際に必要になる場合があります。左辺値を参照するために右辺値参照を使用する必要がある場合、move 関数を使用して左辺値を右辺値に変換できます。C++11 では、std::move() 関数はヘッダー ファイルにあります。関数の名前はわかりにくいです。何も移動しません。唯一の関数は、左辺値を右辺値参照にキャストして実装することです。移動のセマンティクス。

おすすめ

転載: blog.csdn.net/weixin_66828150/article/details/132253752