본문 바로가기
c++/모던c++

전달 참조 forwarding reference (c++17)

by kcj3054 2022. 3. 29.

전달참조?

  • 전달 참조는 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