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