전달참조?
전달 참조는 c++ 17에 와서 나온 것이다. forwarding reference..
전달 참조의 형식은
template<typename T>
void Test_FowardingRef(T&& param) //전달참조
{
Test_Copy(std::forward<T>(param));
}
- 위 모양을 보니 &&를 보면 오른값 참조인 것으로 볼 수 있지만 전달참조는 순수하게 템플릿으로 받아주면 전달참조 현상이 발생한다.
전달 참조 특징
- 전달 참조는 오른값참조도 받아 줄 수 있고, 왼값 참조도 받아 줄 수 있다. 이렇게 하는 이유는 만약 받을 때 특정한쪽만 받아야할 경우 인자가 여러개 일때 함수 자체를 여러개 만들어야할 수 있어서, 전달 참조로 받으면 더 효율적이다..
auto에 && 넣을 경우 !
Knight k1;
auto&& k2 = k1;
auto&& k3 = std::move(k1);
k2는 오른 값으로 받을까? 그렇지 않다 살펴보면 왼값으로 auto가 잡아 준 것을 알 수있다.
k3은 k1의 이동을 통해 받아서 왼값이다..
auto도 그렇고 템플릿으로 받은 T도 그렇고 공통점은 형식 변경이 일어날 경우 전달참조 현상이 발생한다는 것을 알 수 있다.!!!
오른값 참조와 오른값 확인!!!
void Test_RValueRef(const Knight&& k)
{
}
Knight&& k5 = std::move(k1);
Test_RValueRef(std::move(k5));
Test_FowardingRef(std::move(k1));
// Test_RValueRef(k5); Test_RValueRef는 오른값 버전이고, k5도 오른값인데 왜 안돼냐?!
위의 예제에서 주석 처리한 부분은 오류가 발생한다 Test_RValueRef는 오른값 참조를 받을 수 있다 근데 k5도 오른값 참조 타입 아닌가? 여기서 중요한 점은 !!
k5은 오른값 참조이지만 오른 값이 아닌 왼값이다 k5를 다른 곳에서 사용이 가능하니..그래서 Test_RValueRef에 정확하게 전달하기 위해서는 std::move(k5)를 통해서 이동 후 넣어줄 수 있다..
std::forward() 사용
template<typename T>
void Test_FowardingRef(T&& param) //전달참조
{
//왼값 참조인지, 오른값 참조인지에 따라 구분이 필요하다 이것을 std::forward가 해준다..!!
Test_Copy(std::forward<T>(param));
////왼값 참조라면 복사
//Test_Copy(param);
////오른값 참조라면 이동
//Test_Copy(std::move(param));
}
- Test_FowardingRef는 전달참조이다 왼값참조, 오른 값 참조 다 받을 수 있다 그런데 그것을 구분하기 위해서 두가지 버전함수를 쓰지 않고 forward
(param)을 사용하면 자동으로 알아서 해당 버전을 호출해준다.!!
- 루키스님의 c++강의를 통해 학습 후 작성하였습니다.
'c++ > 모던c++' 카테고리의 다른 글
c++20(concept) (0) | 2022.05.23 |
---|---|
varidic template (가변인자.. tuple직접구현..) (0) | 2022.05.22 |
c++ 11 가변인자템플릿 varidic template (0) | 2022.04.07 |
오른값 참조 && (0) | 2022.03.29 |
모던c++ delete (0) | 2022.03.29 |