// 리턴값과레퍼런스이야기
// 값을리턴하는함수
// 1) bulit in type 의값을리턴( ex. int foo() )
//      => 리턴값은상수취급된다.
// 2) user type의값을리턴( ex. Point foo() )
//      => 임시객체를리턴한다.( 일부컴파일러는임시객체를상수취급하기도한다.)
int x = 10;
int& foo()
{
        return x;
}
void main()
{
//      int s = foo();        // 값을리턴하면10 = 30의의미를가진다.
        foo() = 30;           // &을리턴하면된다.
         cout << x << endl;
}
//================================================
// 1. 함수가레퍼런스를리턴하는이유.
//    (1) built in type의레퍼런스( int& foo() )
//             => "함수호출() = 값"의표현을가능하게하기위해
//             => 함수호출이lvalue에놓이기위해.
//    (2) user type의레퍼런스-> 임시객체의생성을막기위해사용.
//             ex) Point& foo()
struct Point
{
        int x;
        int y;
};
Point p = { 1, 2 };
Point& foo()
{
        return p;
}
void main()
{
        foo().x = 10;          // user type의리턴값은상수가아니다.
        cout << p.x << endl;
}