참조 축약
참조 축약을 통해 lvalue 인수가 전달되었는지, rvalue 인수가 전달되었는지 결정된다.
template < typename T >
void func ( T && param );
lvalue 인수가 전달되면 T는 lvalue 참조로 추론되고 rvalue 인수가 전달되면 T는 비참조 형식으로 추론된다.
widget widget_factory (); // rvalue 를 돌려주는 함수
widget w ; // 변수(lvalue)
func ( w ); // func 를 lvalue로 호출한다.
// T는 widget& 로 추론된다.
func ( widget_factory ()); // func 를 rvalue로 호출한다.
// T는 widget으로 추론된다.
T에 대해 추론된 타입으로 템플릿을 인스턴스화한 결과는 다음과 같은 모습일 것이다.
void func ( widget & && param );
컴파일러가 실제로 만드는 최종 함수 시그니처는 다음과 같다.
void func ( widget & param );
참조에 대한 참조는 잘못된 문법이지만 특정 문맥에서는 컴파일러가 참조에 대한 참조를 허용하는데, 템플릿 인스턴스화를 할 때 참조 축약 규칙이 적용된다.
만일 두 참조 중 하나라도 lvalue 참조이면 결과는 lvalue 참조이다. 아니면 rvalue 참조이다.
std::forward 가 참조 축약을 이용한다.
참조 축약 문맥
템플릿 인스턴스화
auto 타입 추론
typedef 및 using 선언
decltype 추론
태그:
auto ,
cpp ,
decltype ,
forward ,
lvalue ,
rvalue ,
typedef ,
using ,
참조 축약 ,
템플릿
카테고리:
cpp
업데이트: February 3, 2018
댓글남기기