質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3219閲覧

C++ int&& (右辺値参照)

kei_10

総合スコア37

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2017/03/30 03:23

編集2017/03/30 03:26

以下のコード内の"int&&"というのはどのような意味なのでしょうか。
ご教授お願いします。

C++11規格でコンパイル・実行しています。
また、以下のコードは下記URLにて公開されております。
『基礎からしっかり学ぶC++の教科書』サンプルコード

C++

1#include <iostream> 2using namespace std; 3 4void f5(int&& x){ cout << ++x << endl; }//xは引数の右辺値参照 5 6int main() 7{ 8 int x5 = 500; 9 f5(static_cast<int&&>(x5));//出力値:501 10 cout << x5 << endl; //出力値:501(変わっている) 11 f5(510); //出力値:511(リテラルもOK) 12}
maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

右辺値参照は、参照の一種です。現在のところ参照は概ね3種類あると考えて良いと思います。

  1. 普通の参照

型名&と書きます。constもないし&も1つだけのものです。
これは、変数に対する参照です。変数以外のもの(定数や一時領域)を参照できません。

  1. const参照

const 型名&や、型名 const&と書きます。
これは、変数と定数と一時領域(計算結果)に対する参照です。
ただし、参照先が変数だった場合でもその変数の中身を変更できません。

  1. 右辺値参照

型名&&と書きます。
これは、一時領域(計算結果。定数含む)に対する参照です。
参照先を変更できます。と言っても参照先はその文の終了と共に解放されますので、変更することに意味はほとんどありません。(ローカル変数として流用できるくらいです。)

一時領域は、例えばfoo(a+b);のような呼び出しで、a+bの結果を保存している一時的な領域です。foo(a+b);等の文の中でこっそり獲得され、文が終わるとこっそり解放されています。

このように右辺値参照そのものはあまり有用なものではないのですが、参照先が一時変数(呼び出している側の文が終わると解放される。)と言う性質が有用です。

どうせ文が終わったら解放されるのですから、例えばstd::vector<>等の巨大な変数の記憶領域をコピーするのではなく、呼び出し先の関数へ渡してしまうことができます。(呼び出し元ではもう使えなくなる。すぐに解放されるので問題無し)
受け取り側はその事実を当てにして、高速なコードを記述できます。(ムーブ・セマンティクスと呼ばれています。)

C++

1std::vector<int> foo(); 2void bar(std::vector<int>&&); 3 4bar(foo());

のような時に有用です。foo()が返却するstd::vector<>が巨大だった場合、一々その巨大なメモリをコピーしないようにプログラムすることが可能になるからです。使い方は難しいですが、結構ありがたいです。


提示されたサンプル・コードは上記の「3. 右辺値参照」で記載した内容が書かれています。正直、この使い方はあまり有用ではないと思います。
更に、static_cast<int&&>()で渡した後の変数にアクセスするのは、意味論的に完全に間違った使い方です。
文法的には間違っていませんが、operator+を減算として定義するような間違いで、他のプログラマに対してたいへん不誠実な行為です。
学習のためと割り切って理解されることをお勧めします。

投稿2017/03/30 04:48

編集2017/03/30 05:16
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei_10

2017/03/30 05:00

丁寧な回答ありがとうございます。 なんとなくですが理解することができました。 もう少し本を読み進めてから読み直してみようと思います。
guest

0

教科書を読んでいるなら、「リファレンス」の説明部分を見てください。

投稿2017/03/30 03:54

otn

総合スコア84491

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei_10

2017/03/30 04:21

リファレンスのところを読み直したのですが、int&などはあってもint&&というのはどこにも載っていませんでした。 int&&というの何を表しているのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問