왼 값(L value) : 단일식을 넘어서 계속 지속되는 개체
오른 값(R value) : L value가 아닌 나머지 ex. 임시 값, 열거형, 람다, i++ 등...
아래를 통해 다양한 참조 방식과 그에 따른 차이점을 살펴보자
class Knight
{
public:
public:
int mhp = 100;
}
void TestKnight_Copy(Knight knight) {}
void TestKnight_LValueRef(Knight& knight) {}
void TestKnight_ConstLValueRef(const Knight& knight) {}
void TestKnight_RValueRef(Knight&& knight) {}
int main()
{
Knight k1;
TestKnight_Copy(k1);
TestKnight_LValueRef(k1);// 왼값 가능
//TestKnight_LValueRef(Knight());// 오른값 불가능
TestKnight_ConstLValueRef(Knight());// const 참조는 오른값이여도 받아줌
TestKnight_RValueRef(Knight());// 오른값 가능
TestKnight_RValueRef(static_cast<Knight&&>(k1);// 형변환을 해줘야 왼값 가능
}
본격적으로 오른 값 참조를 언제 사용하고
이를 활용한 이동대입연산자를 살펴보자
그리고 마지막으로 오른 값 참조인 std::move를 알아보자
class Knight
{
public:
Knight()
{
}
Knight(const Knight& knight)// 복사 생성자
{
}
~Knight()
{
if(mPet)
delete mPet;
}
void operator=(const Knight& knight)// 복사 대입 연산자
{
mHp = knight.mHp;
//mPet = knight.mPet;// 얕은 복사
if(knight.mPet)
mPet = new Pet(*knight.mPet);// 깊은 복사
}
void operator=(Knight&& knight) noexcept// 이동 대입 연산자
{
mHp = knight.mHp;
mPet = knight.mPet;
knight.mPet = nullptr;
// 오른값 참조는 얕은 복사로 해주어도 상관이 없다
// 왜냐하면 인자로 들어온 것은 오른값이며 일시적이기 때문에
// 뺏어서 사용해버리면 된다
}
public:
int mHp = 100;
Pet* mPet = nullptr;
}
void TestKnight_Copy(Knight knight) {}
void TestKnight_LValueRef(Knight& knight) {}
void TestKnight_ConstLValueRef(const Knight& knight) {}
void TestKnight_RValueRef(Knight&& knight) {}
int main()
{
Knight k1;
k1.mPet = new Pet();
k1.mHp = 1000;
Knight k2;
k2 = static_cast<Knight&&>(k1);// k1를 오른값으로 취급하겠다, k1 원본을 날려도 된다는 의미
// std::move란?
// 오른값 참조와 같은 의미이다
Knight k3;
k3.mPet = new Pet();
k3.mHp = 1000;
Knight k4;
k4 = std::move(k3);// std::move는 "static_cast<Knight&&>"와 같은 의미이다
// std::move 사용 예시
std::unique_ptr<Knight> uptr = std::make_unique<Knight>();
std::unique_ptr<Knight> uptr2 = std::move(uptr);
}
'C++ > [루키스] Modern C++' 카테고리의 다른 글
[MC++] Lambda (0) | 2023.07.02 |
---|---|
[MC++] 전달 참조 (Forwarding reference) (0) | 2023.07.02 |
[MC++] override, final (0) | 2023.07.01 |
[MC++] delete (0) | 2023.07.01 |
[MC++] enum class (0) | 2023.06.30 |