참조 축약
- 참조 축약을 통해 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 추론
댓글남기기