본문 바로가기

Cpp

L-value, R-value

L-value, R-value 는 c++11 이전과 이후로 개념을 다르게 잡는다.

 

c++11 이전에는 연산에서 왼쪽에 존재 할 수 있는 값, 오른쪽에 존재해야하는 값으로 L-value, R-value를 나눌 수 있다.

c++11 이후에도 맞는 말이지만 좀 더 추가된 개념이 있다.

 

lvaue

     등호의 왼쪽과 오른쪽 전부 존재 가능

     식별자를 가지고 있다.

     해당 문장을 벗어난 후 사용 가능하다.

     주소 연산자로 주소를 구할 수 있다.

     참조를 리턴하는 함수.

rvalue

     등호의 오른쪽에만 존재 가능.

     식별자가 없다

     해당 문장에서만 사용

     주소 연산자로 주소를 구하는게 불가능하다.

     value 를 리턴하는 함수, 임시객체 등등

 

int a = 0;
int b = 25;

// a,b 는 Lvalue로 식별자를 가지는 변수로 데이터를 복사해서 값을 변경가능하다.
// 0,25 는 Rvalue 이다.

0 = a;
a + b = 25;
sum() = 30; // 등등
// Rvalue 는 다른 데이터의 메모리를 복사할 공간이 없거나, 식별자가 없어 대입이 불가능.

c++11 이후에는 Lvalue를 Locaor Value 로 메모리를 식별할 수 있는지의 여부도 포함하게 되었다.

또한, const의 활용으로 메모리 주소를 파악하더라도 수정이 불가능한 Lvalue가 있게 되었다.

 

주소를 가지지만 수정 불가능한 Lvalue

배열, Const 등

 

Rvalue 는 식별자를 특정할 수 없는 데이터이다.

 

Rvalue reference

1. 일반 참조(&) 타입은 lvalue만 참조 가능

2. const 참조(&) 타입은 lvalue와 rvalue 둘 다 참조 가능

3. rvalue reference(&&) 는 rvalue만 참조 가능

4. move 와 perfect forwarding에서 사용

 

int main()
{
	int a = 10;

	// 일반 참조자는 lvalue 만 참조 가능
	int& b1 = a;	
	int& b2 = 25;	// 불가능

	// const 참조자는 lvalue 와 rvalue를 모두 참조 가능
	const int& b3 = a;	
	const int& b4 = 25;	 

    // 참조는 가능하지만 상수성 때문에 값 변경 불가
	const Mon& b = Mon(25); // 임시 객체의 attack 이 25
	b.attack = 10; // 불가

	// rvalue reference 는 rvalue 만 가리킬수 있다. C++11 이후 문법.
	int&& b5 = a;	// error
	int&& b6 = 25;	// ok.
}

 

'Cpp' 카테고리의 다른 글

콜백 함수  (0) 2023.06.19
허상 포인터(댕글링 포인터)  (0) 2023.06.19
스마트 포인터  (0) 2023.06.13
얕은 복사 깊은 복사  (0) 2023.06.13
함수 포인터  (0) 2023.06.13