최대 1 분 소요

참조 축약

  • 참조 축약을 통해 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 가 참조 축약을 이용한다.

참조 축약 문맥

  1. 템플릿 인스턴스화
  2. auto 타입 추론
  3. typedef 및 using 선언
  4. decltype 추론

댓글남기기