86137


「リファレンス型を代入式の右辺に書くと、どういう意味になるのか」がよくわかっていません。

以下のコードの実行結果を見ると、  
`int& ref2 = ref1 //★1`では「ref2は、ref1と同じ値を参照する」という参照のコピーが行われているように見えるのに対して、  
`int j = ref1 //★2`では、「jにref1の値をコピーする」という値のコピーが行われているように見えます。

[code]

    int main()
    {
        int i = 1;
    
        int& ref1 = i;
    
        int& ref2 = ref1; //★1
    
        int j = ref1; //★2
    
        ref1 = 2;
    
        std::cout << ref1 << std::endl; //2
    
        std::cout << ref2 << std::endl; //2
    
        std::cout << j << std::endl; //1
    }
    
[/code]

そうなると、「単にリファレンス型の変数名を右辺に書いたとき、これはどういう意味になるのか？（参照か、値か？）」ということがよく理解できません。「★1のようにリファレンス型を別のリファレンス型で初期化するときは特別で、それ以外は参照している値を意味する」という解釈なら一応納得できますが、それで合っていますか？


CC BY-SA 4.0
2022-02-03T13:15:26.023
86126
2022-02-04T02:47:19.413
50949
question
c++
リファレンス型を代入式の右辺に書くと、どういう意味になるのか


>
> 「★1のようにリファレンス型を別のリファレンス型で初期化するときは特別で、それ以外は参照している値を意味する」という解釈なら一応納得できますが、それで合っていますか？

（おおまかに）はい。

* * *

ソースコード上の見た目は似通っていますが「変数宣言＋初期化に現れる`=`」と「代入式に現れる`=`」は別物です。変数宣言における`=`の右側（初期化子）では、初期化対象の変数型によってその解釈が変化します。

[code]

    int i = 1;        // int変数iに値1(右辺値)を代入
    int& ref1 = i;    // int&変数ref1に「変数iへの参照」(左辺値)を代入
    int& ref2 = ref1; // int&変数ref2に「変数ref1への参照」(左辺値)を代入
    int j = ref1;     // int変数jに「変数ref1への参照」(左辺値)から中身の値1(右辺値)を取り出して代入
    
[/code]

4番目の`int j = ref1;`では、左辺値から右辺値への変換(lvalue-to-rvalue conversion)が行われています。


CC BY-SA 4.0
2022-02-04T02:47:19.413
86137
2022-02-04T02:47:19.413
49
86126
answer