C언어, C++11이전까지의 L-value, R-value
L-value : locator value, 저장 장소 위치의 값, 할당 연산자 기준으로 왼쪽에 오는 값
R-value : value of an expression, 수식의 값, 할당 연산자 기준으로 오른쪽에 오는 값
C++11 이후
출처: https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=vs-2019
glvalue, xvalue, prvalue 개념이 새로 생겼다 일단
L-value와 R-value 부터 정리하면
위 코드에서 left_value, right_value, result 는 모두 L-value 로서 식별자(변수이름)를 가지고 다른 데이터를 복사해서 자신의 상태(값)를 변경 할 수 있다.
3, 7, 0 은 모두 R-value 이다.
R-value는 다른 데이터의 메모리를 복사할 공간이 없거나, 식별자가 따로 존재하지 않기 때문에 대입이 불가능하다.
또한 3,7,0 은 식별자가 따로 존재 하지 않기 때문에, 따로 변수처럼 접근 할 수 없어, 일시적인 값, 사라지는 값이라고 할 수 있다
L-value는 Locator value, 존재하는 메모리를 식별할 수 있는지의 여부, 즉 식별자가 있어야 하고, 식별자를 가지고 다른 값을 복사 받을 수 있으면 L-value 라고 할 수 있다.
그러나 배열타입, 불완전한타입, const 타입은 Lvalue 로 올 수 없다
R-value는 value of an expression, 즉 수식을 계산한 후의 값이다, 위에서 left_value + right_value 는
수식 (left_value의 값) + (right_value의 값)의 결과 값 10 이 되고
10( left_value + right_value 의 결과 값 )은 식별자가 존재 하지 않기 때문에 R-value인 것이다
이제 glvalue, xvalue, prvalue 를 파헤쳐 보면
크게 식별자의 유무에 따라서 나눌 수 있고
식별자 있음 : glvalue( xvalue, lvalue)
식별자 없음 : prvalue
move의 가능 여부 에 따라서 나눌 수 있다
move 가능 : rvalue(xvalue, prvalue)
move 불가능 : lvalue
여기서 move의 가능이란, move semantics 가 가능하다 또는 값이 메모리에서 이동 될 수 있는것을 말한다.
위 MSDN 정리 그림을 https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=vs-2019
다시 표시하면
이렇게 볼 수 있다
lvalue : identity를 가짐, move 될 수 없는 표현식들
xvalue : identity를 가짐, move 될 수 있는 표현식들
prvalue : identity 를 안가짐, move 될 수 있는 표현식들
glvalue : identity 를 가지고 있는 표현식들(lvalue, xvalue)
rvalue : move 될 수 있는 표현식들(prvalue,xvalue)
'C++' 카테고리의 다른 글
c++ typeid 연산자 (0) | 2020.03.16 |
---|---|
References(L-value reference, R-value reference) (0) | 2020.03.13 |
C++ Inheritance (상속) _ 다형성, 업캐스팅, 다운캐스팅 (0) | 2020.03.10 |
C++ Inheritance (상속)_ 상속관계, 접근권한, 생성자,소멸자 순서 (1) | 2020.03.09 |
c++ Singleton Pattern 기본 구현 방법 (0) | 2020.03.03 |