Info

해당 글에서는 포워딩 레퍼런스가 어떤 것인지에 대해서 다룬다.

바로 예시를 보자.

#include <type_traits>
#include <iostream>
using namespace std;
 
template<typename T>
void perf(T&& t) {
    // T, t의 실제 타입을 출력해 봅니다.
    cout << "T is " 
         << (std::is_lvalue_reference<T>::value ? "lvalue-ref" : "not lvalue-ref")
         << ", t is " 
         << (std::is_lvalue_reference<decltype(t)>::value ? "lvalue-ref" : "rvalue-ref")
         << "\n";
}
 
int main() {
    int x = 0;
 
    perf(x);    // lvalue 전달
    perf(0);    // rvalue 전달
}
 
---------------------------------------------------------
출력
T is lvalue-ref, t is lvalue-ref
T is not lvalue-ref, t is rvalue-ref
---------------------------------------------------------

여기서 perf함수의 인자로 사용된 T&& t와 같은 인자의 형식을 포워딩 레퍼런스라고 부른다.


이는 예제와 같이 타입을 다음과 같이 추론(deduce)하게 된다.

  • lvalue를 넘기면 lvalue reference로 추론
  • rvalue를 넘기면 rvalue reference로 추론

이때 템플릿 매개변수 t는 함수 내부에서 항상 lvalue 표현식이 되므로, 원래의 lvalue/rvalue 특성을 보존하려면 perfect forwarding을 수행해야 의도한 성능(move 호출 등) 이점을 얻을 수 있다.