본문 바로가기

CS 지식

[C++] L-value, R-value

1. L-value, R-value

L-value (Left value): 표현식 이후에도 사라지지 않는 값으로, 접근할 수 있는 주소를 가지고 있는 변수다. 계속 접근할 수 있다.

R-value (Right value): 표현식 이후 사라지는 값으로, 임시 변수다.

int main()
{
	int x = 3;
    const int y = x;
    int z = x + y;
    int* p = &x;
    
    cout<<string("one");
    
    ++x;
    x++;
    }

 

이 코드에서

l-value: x, y, z, p

r-value: 3, x+y, &x, string("one"), x++

#include <iostream>

int GetValue()
{
	return 10;
}

int main()
{
	int i = GetValue(); //GetValue()는 단순 값을 반환하기 때문에 r-value다.
    GetValue() = 5; ///GetValue()는 r-value기 때문에 다른 값을 할당할 수 없다. 이 코드는 에러가 난다.
}

r-value는 l-value에만 할당할 수 있다.

 

#include <iostream>

void SetValue(int value)
{
	
}

int main()
{
	int i = 10;
    int& a = 10; //오류!
    const int& a = 10; //정상작동함.
    SetValue(i); //l-value
    SetValue(10); //r-value
}

 

2. Reference (참조)

L-value reference: &(앰퍼샌드 / Ampersand)로 참조함

#include <iostream>

int& GetValue() //l-value reference
{
	static int value = 10;
	return value;
}

int main()
{
	int i = GetValue(); 
    GetValue() = 5; //GetValue()는 참조를 받아서 이제 l-value가 되었기 때문에 코드가 문제없이 작동한다.
}

 

R-value reference: &&로 참조함

#include <iostream>

void PrintName(const std::string& name) //l-value reference
{
	std::cout << "[lvalue] " << name << std::endl;
}

void PrintName(std::string&& name) //r-value reference
{
	std::cout << "[rvalue] " << name << std::endl;
}

int main()
{
	std::string firstName = "Yan";
   	std::string lastName = "Chernikov";
    
   	std::string fullName = firstName + lastName;
    
   	PrintName(fullName); //l-value reference 사용
   	PrintName(firstName + lastName); //r-value reference 사용
    
   	std::cin.get();
}

 

참고자료

https://www.youtube.com/watch?v=fbYknr-HPYE

https://blog.naver.com/luku756/221808884092

 

+ move semantics

+ 스마트 포인터

'CS 지식' 카테고리의 다른 글

[C++] Name Mangling (Decoration)  (0) 2025.04.14
[C++] 스마트 포인터  (0) 2025.04.13
[C++] 이동 의미론 (Move Semantics)  (0) 2025.04.13
[C++] 포인터  (0) 2025.04.13
객체지향 설계의 5가지 원칙 (SOLID)  (0) 2025.04.11