foo
タイプ「int」のオブジェクトへの参照を返しています。その「int」がどこから来たのかは気にせず、それが存在すると仮定します。
最初の行 は、 の戻り値によって参照されるものとまったく同じ "int" 型のオブジェクトも参照する をint& intRef = foo()
作成します。intRef
foo
2 行目の value ofintVal
は、返された参照によって参照されるオブジェクトの値に置き換えられます。
あなたのコメントに応えて:
ポインターと参照の間で非常に混乱しているようです。参照は、オブジェクトの別名のようなものです。参照に対して何かを行うと、参照先のオブジェクトに実際に影響します。
参照を逆参照するようなことはありません。逆参照できるのはポインターのみです。逆参照とは、単項演算子を使用し*
て、ポイントが指すオブジェクトを取得する行為です。たとえば、 がある場合、それが指しているオブジェクトを取得するint* p
ことができます。*p
これは逆参照 p
です。
参照に対して実行できるのは*
、参照先のオブジェクトがポインターである場合 (またはオーバーロードされている場合operator*
) だけです。あなたの場合、をfoo
返すのでint&
、それを逆参照することはできません。式*foo()
はコンパイルされません。これは、 の戻り値のfoo
型が「int」であり、ポインターではなく、オーバーロードされないためoperator*
です。
foo
すべての意図と目的のために、返された参照を単にそれが参照するオブジェクトとして扱うことができます。この値をに代入することは、次のコードでに代入するintVal
ことと実際には違いはありません。x
intVal
int intVal;
int x = 5;
intVal = x;
お分かりだと思いますが、 にintVal
は の値が与えられますx
。これは、標準によって簡単に定義されます。
単純代入 ( =
) では、式の値が左オペランドによって参照されるオブジェクトの値に置き換わります。
演算子の両側が同じ型であるため、変換を行う必要はまったくありません。
これは実際にあなたの状況と同じです。あなたはただ持っています:
intVal = some_ref_to_int;
some_ref_to_int
式はどこにありますかfoo()
。それが参考になるという事実は問題ではありません。intVal
参照が示すオブジェクトの値を受け取ります。