david's daily developer note

[C,C++] lvalue, rvalue 본문

[Develop] Native/C++ , C

[C,C++] lvalue, rvalue

mouse-david 2018. 5. 25. 17:39
728x90

Lvalues, rvalue..

내가 컴퓨터 언어론을 배웠던 호랑이 담배피던 그 시절.

구구단 프로그램 만들면서 성취감을 느끼던 그 시절

나는 대입연산자를 기준으로 좌측에 있으면 lvalue, 우측에 있다면 rvalue라고 배웠다.

정말 배운건지, 그 정도로만 이해하고 무시했는지는 정확하지 않다.

나는 평소에도 읽었던 전공서적을 틈틈히 다시보는 습관이 있는데(최근에는 그럴 시간이 없다. 할 수 있을때 많이하자...),

Effective Modern c++, Effective C++등의 책을 보면, 항상 서두에 중요한 개념이라면서

lvalue, rvalue의 정의가 나온다. 그런데, 세월이 지날수록 이 놈들을 설명하는 글들이 길어지고 있다.

개념이 점차 모호해 지고 있기 때문이다.

더욱 정확하게 말하면 C++버전이 올라갈수록 즐거운 개념들이 추가되고 있고,

기존에 단순한 개념이 함게 복잡해지는 것이겠다.

시간이 더 지나면 양자역학 수준이 될 것같아서 한번 잡고 가려한다.

lvalue, rvalue 개념 정리에 도움이 되는 유용한 설명글을 소개한다.


"일반적으로, 주소를 취할 수 있다면 왼값이고, 취할 수 없다면 오른값이다."


표현식을 기준으로 lvalue 혹은 rvalue로 한가지로 정의할 수 없다는 것을 말하고 있다.

즉, lvalue와 rvalue는 표현식과는 무관하고 어떤 형식이던 lvalue이거나 rvalue가 될 수 있다는 것이다.

그리고 그 와중에, 주소를 취할 수 있다는 기준으로 lvalue를 정의할 수 있다고 한다.

처음에는 아리송했지만, 이해를 하기 위한 다양한 접근 방법들을(수 많은 블로그, 문서 등..) 반복적으로 보다보니, 

저 문장이 짧고 간결하고 핵심적인것 같다!


class test

{

public:

test( test&& rhs);

};


test클래스 이동생성자의 매개변수 형식은 rvalue참조이다.

매개변수의 형식은 분명 rvalue이지만, rhs 매개변수 자체는 생성자 범위내에서

주소로 참조가능한 lvalue이다.

(rhs는 이동,복사생성자 매개변수 이름으로 자주쓰이며 "right-hand side(우변)"의미이다)

상기 예를 통하여 모든 형식 T는 표현식과 무관하게 l,rvalue가 될 수 있다는 것을 알 수있고,

주소를 취할 수 있는가의 여부로 lvalue를 판단할 수 있다는 점도 알 수 있다.


더 많은 예제를 올리고 싶지만,

저 개념을 생각하고 lvalue, rvalue에 대한 글들을 찾아보기 바란다.


참고1. Effiective Moden C++

참고2. http://jeremyko.blogspot.kr/2012/08/lvalue-rvalue.html (필자의 이해하려는 노력이 정말 대단해 보인다!)

728x90

'[Develop] Native > C++ , C' 카테고리의 다른 글

[C,C++] STL Container Reserve  (0) 2018.05.28
[C,C++] emplace_back  (0) 2018.05.28
[C,C++] Variadic Template  (0) 2018.05.17
[C,C++] 실행파일이 만들어지는 단계  (0) 2018.05.17
[C,C++] 디버깅++  (0) 2012.03.06