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 |