右辺値にメモリアドレスがないのはなぜですか? プログラムの実行時に RAM にロードされませんか、それともプロセッサ レジスタに格納された値を参照しますか?
5 に答える
あなたの質問(「右辺値にメモリアドレスがないのはなぜですか?」)は少し混乱しています。右辺値は一種の式です。 式にはアドレスがありません 。オブジェクトにはアドレスがあります。「アドレス演算子を右辺値式に適用できないのはなぜですか?」と尋ねる方が正しいでしょう。
その答えはかなり単純です。オブジェクトのアドレスのみを取得でき、すべての右辺値式がオブジェクトを参照するわけではありません(たとえば、式42
には値がありますが、オブジェクトを参照していません)。
一部の右辺値式はオブジェクトを参照しますが、そのようなオブジェクトには永続性がありません。右辺値式によって参照されるオブジェクトは一時オブジェクトであり、それが作成された式の最後で破棄されます。このようなオブジェクトには実際にアドレスがあります(一時オブジェクトのメンバー関数を呼び出すことで簡単に見つけることができます。this
ポインターは一時オブジェクトを指している必要があるため、一時オブジェクトにはアドレスが必要です)。
これが左辺値式と右辺値式の根本的な違いです。左辺値式は、永続性を持つオブジェクトを参照します。左辺値式が参照するオブジェクトは、単一の式を超えて永続化します。
式rvalue
の値と考えてください。値自体にはアドレスがありません。ただし、式に含まれるオブジェクトにはアドレスがあります。一時的なオブジェクトであっても、オブジェクトのアドレスを取得できます。
このことを考慮、
const int & i = 10; //ok
ここで、10
は右辺値であるため、 のアドレスであることがわかります。いいえ、それは間違っています。は、式から作成されるタイプの一時オブジェクトのアドレスです。また、一時オブジェクトは非 const 参照にバインドできないため、 を使用します。つまり、以下はエラーです。&i
10
&i
int
10
const
int & i = 10; //error
つまり、右辺値にはアドレスがあります。した事がある
Type const value& = rvalue;
Type const* address = &value;
単にこのケースを取る
int a = 1 + 2;
1+2 は 3 に解決されます。
自問してみてください:
- 3 はオブジェクトですか?
- 3 はメモリ内のどこに配置されますか?
オブジェクトのアドレスが必要な場合は、& を使用します。
右辺値がアドレス指定可能である場合、コンピューターが格納することを決定した場所へのポインターを宣言できることを意味します 3
int* a = &3;
それは正しいと思いますか?:)