본문 바로가기

# Lang/C++

5.2 완벽한 전달

 1. 보편참조 (universal reference)

보편참조는 템플릿에서만 사용할 수 있다.


모든 참조를 가르킬 수 있어, 각 참조의 모든 경우를 하나의 케이스로 받을 수 있으므로,

유연한 템플릿 함수의 설계가 가능하다.



모양새는 우측값 참조지만, universal 참조로 번역된다.

늬앙스가 다르므로 주의.







 2. 참조겹침 규칙 (reference collapsing) 

레퍼런스 겹침 법칙 (참조 캐스팅 법칙)

  • (A&) & becomes  A&
  • (A&) && becomes  A&
  • (A&&) & becomes  A&
  • (A&&) && becomes  A&&


보편참조를 우측값 참조로 캐스팅하면,

보편참조가 어떤 참조형식을 받았는지 알아낼 수 있다.





 3. 완벽한 전달 (perfect forwarding)

보편참조가 받은 참조형식을 손상시키지 않고, 

다른 함수의 인자로 완벽하게 전달하는 것.


보편참조 형식을 우측값 참조로 캐스팅하여 전달하거나,

우측값 참조로 캐스팅 해주는 forward 함수를 사용하여 전달한다.



참조겹침 규칙에 의해,

  • 좌측값이라면 우측값으로 캐스팅해도, 좌측값.
  • 우측값이라면 우측값으로 캐스팅해도, 우측값.

으로 캐스팅된다.






 4. 상수형 변수의 전달 (const qualified)

T는 const T로 받을 수 없다.

const을 인자로 갖는 템플릿 함수를 별도로 정의해야 한다. 






 5. 완벽한 전달이 해결한 문제

생성자를 간접적으로 호출하여 객체를 생성하는 팩토리 함수를 생각해보자.



Human 생성자를 호출하는 factory 함수

  • factory( name, age, address )
  • factory( name&, age, address )
  • factory( name&&,  age, address )
  • factory( name, age&, address )
  • ...


완벽한 전달이 불가능했다면, 각 경우마다 팩토리 함수를 오버로딩해야 했을 것 이며.

비슷한 코드들이 무수히 중복되는 문제가 발생할 것 이다.  (생성자의 오버로딩은 피할 수 없다.)



완벽한 전달이 템플릿 함수를 하나만 사용해도 되도록 하였으며,

섹션 1의 그림을 다시보면, 위의 예시를 이해하기 수월할 것 이다.






 6. 참고 문헌

 

씹어먹는 C++ - <12 - 2. Move 문법 (move semantics) 과 완벽한 전달 (perfect forwarding)>

...

modoocode.com


 

5일차 - 완벽한 전달자 (perfect forwarding) (2)

Intro 이전 글에서 다루었던 우측값(rvalue)은 주로 두가지로 활용된다. 하나는 완벽한 전달자이고, 다른 하나는 move semantics이다. 이번 글에서는 첫번째 항목인 완벽한 전달자를 만드는 것에 초점을 맞추고자..

narss.tistory.com

 

'# Lang > C++' 카테고리의 다른 글

6.2 중괄호 리스트 초기화  (0) 2019.04.30
6.1 로컬변수 초기화  (0) 2019.04.22
5.1 이동 의미론  (0) 2019.04.18
4.3 우측값 참조 (rvalue reference)  (0) 2019.04.16
4.2 값의 유형 (glvalue, prvalue, xvalue)  (0) 2019.04.11