Cpp 右辺値参照 新しいページはコチラ
提供: yonewiki
(→右辺値参照) |
(→右辺値参照) |
||
32行: | 32行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
だから、何?普通のint型と何も変わらないような感じですよね。でもこの参照は右辺値を参照するためのものなので、通常の変数を渡すとコンパイルエラーになります。これははっきりと通常ポインタ変数で扱わないものを型として区別できるとことが、この右辺値参照の活用の道となっています。右辺値というは通常は変数にはとっておかなくていい、一時的な値です。その通常はとっておかなくていいような値を右辺値参照によって取り出して引数として受け取り、それを活用しようとする技術です。 | だから、何?普通のint型と何も変わらないような感じですよね。でもこの参照は右辺値を参照するためのものなので、通常の変数を渡すとコンパイルエラーになります。これははっきりと通常ポインタ変数で扱わないものを型として区別できるとことが、この右辺値参照の活用の道となっています。右辺値というは通常は変数にはとっておかなくていい、一時的な値です。その通常はとっておかなくていいような値を右辺値参照によって取り出して引数として受け取り、それを活用しようとする技術です。 | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | int = nSize | ||
+ | int&& rrefnSize = nSize; //これは駄目。 | ||
+ | </syntaxhighlight> | ||
+ | このようにすると以下のようなコンパイルエラーとなります。 | ||
+ | <syntaxhighlight lang="text"> | ||
+ | error C2440: '初期化中' : 'int' から 'int &&' に変換できません。 | ||
+ | </syntaxhighlight> | ||
+ | VC++なら記述した段階で、不正な代入としてチェックされ、nSizeの文字の下に赤い波線が付きます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | int = nSize | ||
+ | int&& rrefnSize = static_cast<int&&>(nSize); //これはOK。 | ||
+ | </syntaxhighlight> | ||
+ | このようにint&&型に[[C キャスト | キャスト]]すれば大丈夫です。これはどういう事かというと、キャストがされると結局は参照が出来るようになるというだけなので、通常の参照と変わらないです。ただ型が右辺値参照で扱われる参照になるので、このあと再度、右辺値を代入することはできて、nSizeの中身が変更されます。ただし、右辺値で無い値を入れることは出来ないので、再度、キャスト付きでしか通常の参照のやり直しをすることはできません。 | ||
+ | |||
+ | int Function(){ | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | のような関数があったとして、int&& rrefnCnt = Function();とすることもできます。構造体やクラスのメンバ関数に対してもキャストすることなく右辺値として参照を受け取ることができます。このような右辺値戻り値を引数にとるような関数で演算子のオーバロードによる代入演算子の再定義を活用すれば、とっておかなくてもいい引数であるがゆえに受け取った引数をコピーせず、移動させることで、代入するような関数を作ることができます。言葉での説明ではイメージできないと思うので、実際にやってみた方がいいですね。 | ||
通常はとっておかなくていいものを残すとは、どういうことなのかを示す具体的なサンプルは作成中です。右辺値が必要になるようなプログラムって難しいですから、ちょっと時間下さい。っていつまでw | 通常はとっておかなくていいものを残すとは、どういうことなのかを示す具体的なサンプルは作成中です。右辺値が必要になるようなプログラムって難しいですから、ちょっと時間下さい。っていつまでw |