Perfect forwarding — preserve value category when passing arguments.
1template <typename T>2void wrapper(T&& arg) {3 target(std::forward<T>(arg));4}
Without forwarding:
1void wrapper(int& arg) { target(arg); } // lvalue OK2void wrapper(int&& arg) { target(arg); } // rvalue becomes lvalue!
With perfect forwarding:
1template <typename T>2void wrapper(T&& arg) {3 target(std::forward<T>(arg)); // preserves value category4}
Use cases:
std::make_unique, std::make_shared