std::forward는 원래 값 범주를 되살린다

템플릿 wrapper 안에서 이름 있는 arg는 lvalue가 됩니다. std::forward<T>가 호출자의 의도를 다시 적용합니다.

template<class T> void wrapper(T&& arg) process(std::forward<T>(arg));

wrapper(lval)

추론 T = int&
전달 결과 process(int&)

lvalue로 받은 값은 끝까지 lvalue 참조 오버로드로 전달됩니다.

wrapper(20)

추론 T = int
전달 결과 process(int&&)

rvalue로 받은 값은 rvalue 참조 오버로드로 전달됩니다.

구분: std::move는 무조건 rvalue로 보이게 하고, std::forward는 템플릿에서 받은 원래 범주를 보존합니다.