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 호출 등) 이점을 얻을 수 있다.