프로그래밍/C++

전달 참조(보편 참조)와 forward

우대비 2022. 11. 9. 21:40
반응형

보편 참조 == 전달참조

보편 참조라는 이름이 c++17로 오면서 전달 참조라고 바뀜

 

전달 참조가 무엇이냐!

코드 부터 보겠음

template<typename T>
void Test_ForwardingRef(T&& param) 
{

}

&&가 두개.. 오른값을 인자로 받는 코드인가??

 

 

오른값(rvalue)과 이동 대입 연산자

value는 두개로 나뉠 수 있는데 하나는 왼값( lvalue ) 또 하나는 오른값( rvalue ) int a = 5; 위 코드에서 a가 왼값이고 5가 오른값이라고 할 수 있음 즉 왼값은 - 단일식을 넘어서 계속 지속되는 개체를

flrjtwjrjt.tistory.com

 

Knight k1;
Test_ForwardingRef(k1);
Test_ForwardingRef(std::move(k1));

하지만 왼값, 오른값 둘 다 들어감..!

사실 T&&는 전달 참조로 왼값과 오른값 둘 다 받는 형식임

 

전달 참조

- 왼값을 넣어주면 왼값으로, 오른값을 넣어주면 오른값으로 동작함 

void Test_Copy(Knight k)
{

	
}

template<typename T>
void Test_ForwardingRef(T&& param)
{
	Test_Copy(std::move(param)); // 왼값이 올 수도 있기 때문에 사용하면 안됨
	Test_Copy(param); // 오른값이 올 수도 있기 때문에 사용하면 안됨
}

 

그렇다면 위와 같은 문제가 생김

 

왼값이면 왼값에 맞는 내용을

오른값이면 오른값에 맞는 내용을 적어야하는데

뭐가 올지 모른다는거임!!

그럴때 사용하는게 바로 forward!

 

forward

class Knight
{
public:
	Knight() { cout << "기본 생성자" << endl; }
	Knight(const Knight&) { cout << "복사 생성자" << endl; }
	Knight(Knight&&) noexcept { cout << "이동 생성자" << endl; }
};


template<typename T>
void Test_ForwardingRef(T&& param)
{
	// 왼값 참조라면 복사 생성자가 실행
	// 오른값 참조라면 이동 생성자가 실행
	Test_Copy(std::forward<T>(param)); 
}

forward를 사용하면 왼값인지 오른값인지 구분해서 알잘딱 해줌!

 

이러한 forward의 특성 때문에 

forward와 전달 참조는 항상 붙어다닌다고 알고 있으면 됨

반응형
LIST

'프로그래밍 > C++' 카테고리의 다른 글

스마트 포인터  (0) 2022.11.10
C++ Lambda  (0) 2022.11.10
오른값(rvalue)과 이동 대입 연산자  (0) 2022.11.09
using, typedef  (0) 2022.11.09
중괄호 초기화와 initializer_list  (0) 2022.11.08