質問するログイン新規登録

Q&A

解決済

2回答

344閲覧

右辺値参照がアドレスを持っていることについて

apa

総合スコア76

C++

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

0グッド

0クリップ

投稿2026/02/08 13:48

0

0

下記に関してxがzのアドレスを持つことはわかりますが
右辺値を参照した際に32という値の参照を持つことが不思議でなりません。
32という右辺値にアドレスが存在するのでしょうか?
もしくは右辺値をバインドするときだけ新規でアドレスを割り当てる(今回の場合yが)のでしょうか?

int z = 10; const int& x = z; cout << &x << "\n"; const int& y = 32; cout << &y << "\n";

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

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

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

guest

回答2

0

整数リテラル (を評価した結果) が右辺値であるというのは正しい理解です。 原則として右辺値は完結式の終わりに解体されてしまうのでそれを指していたポインタや参照は無効になります。

しかし例外があるのです。 int& は通常は左辺値しか束縛できませんが const が付くと左辺値も右辺値も束縛できて、参照に束縛された右辺値は参照の寿命が尽きるまで寿命が延長されるという特別扱いがあります。 また、左辺値参照も右辺値参照も左辺値ですので実質的に左辺値に変換されたかのように考えてもよいんじゃないかと思います。

投稿2026/02/09 03:51

編集2026/02/10 03:23
SaitoAtsushi

総合スコア5852

0

ベストアンサー

32は右辺値ではありません
32リテラルです
リテラルの返す戻り値(int)が右辺値です
リテラルそのものは単一の式です
またconstで宣言された定数が特定のメモリ領域に属するとは限りません
定数は値のシンボルなのでint &xも単一のシンボルです
定数の扱いは実装依存となります
実際32は右辺値であるにも関わらず左辺値であるかのように振る舞っています
右辺値は左辺値へ代入できませんが、定数なのでメモリの扱いを考慮する必要がありません

では、本来の右辺値を明示的に扱いたい場合はどうするかというと、以下のように宣言します

int &x=(int &)(int &&)32;

左辺値や右辺値はメモリ領域を抽象化します
一方でメモリ外の領域は関知しません
メモリ外の領域とはレジスタなどを指します
値をメモリで扱うにはメモリに値をセットしなければなりません
例えばx64系アーキテクチャでは関数の引数値をいったんレジスタに保存しますが、引数へのアクセスを検知した際にその領域へ改めて値をコピーします
32というリテラルは単一の値である前に一個の命令です
実体が存在するとするならばそれはテキストとしてか、機械語のオペランドとしてです
(int &&)32とすること初めて実体となるデータがメモリに記録されます
一方で

int z=10,&x=z;

とする時は、既に存在する変数zの領域をxで参照します
これはzのポインタを取っているように見えますが、やはりこれも実装依存です
変数は左辺値を返す手続きとして機能します
int &x=zintの左辺値をxで受け取る式という意味で、xをポインタとして定義する文脈ではありません
実装次第でxz自身として振る舞います
xzのアドレスを取得しているのではなく、領域を格納しています

全てのメモリは、左辺値と右辺値のどちらにも解釈が可能です
例えば変数の領域も右辺値として扱えます

int z=10,&&x=(int &&)z;

32のような特定のメモリ領域を持たない式は、右辺値として解釈されたメモリにそのままセットされます
右辺値として宣言された変数領域に対するリテラルの適用は、事実上代入と同一です

int &&x=32;

よって、int &x=(int &)(int &&)32;という式は、右辺値をそのまま左辺値に再解釈して左辺値として宣言された変数領域に代入する手続きとなるので、実質的にint x=32と同義となります

int &x=(int &)(int &&)32; printf("%d",*&x);
32

投稿2026/02/08 16:59

Manabu

総合スコア139

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問