#include <iostream>

using namespace std;

void doSomething(int &lref)
{
    cout << "L-value ref" << "\n";
}

void doSomething(int &&ref)
{
    cout << "R-value ref" << "\n";
}

int getResult()
{
    return 100*100;
}

int main()
{
    int x = 5; // R-value는 이 문장이 끝나면 사라짐
    int y = getResult();
    const int cx = 6;
    const int cy = getResult();
    
    // L-value references
    
    int &lr1 = x; // Modifiable l-values
    // int &lr2 = cx; // Non-modifiable l-values
    // int &lr3 = 5; // R-avlues // 메모리 주소가 없으므로 에러.
    
    const int &lr4 = x; // Modifiable l-values
    const int &lr5 = cx; // Non-modifiable l-values
    const int &lr6 = 5; // R-values
    
    // R-value references
    // int &&rr1 = x; // Modifiable l-values
    // int &&rr2 = cx; // Non-modifiable l-values
    int &&rr3 = 5; // R-values // 곧 사라질 아이들만 담겨질 수 있다.
    int &&rrr = getResult(); // 임시로만 저장되어 있는 애를 어딘가에 저장해놓는다. 왜 필요할까?
    
    cout << rr3 << "\n"; // 5
    rr3 = 10;
    cout << rr3 << "\n"; // 10
    
    // const int &&rr4 = x; // Modifiable l-values
    // const int &&rr5 = cx; // Non-modifiable l-values
    const int &&rr6 = 5; // R-values
    
    // L/R-value referecne 
    doSomething(x); // l-value
    //doSomething(cx); const를 인자로 받지 못한다.
    doSomething(5); // 메모리를 갖지 못하는 애들은 R-value
    doSomething(getResult()); // R-value
    
    
    return 0;
}