How std::forward<T> preserves value category (lvalue vs rvalue) in generic code:
When a template argument is T&& in a deduced context (forwarding reference), T deduces to Widget& for lvalues and Widget for rvalues.
template<typename T>
void Wrapper(T&& arg) {
// std::forward restores the original value category:
// If arg was an rvalue, forwards as rvalue (enables move)
// If arg was an lvalue, forwards as lvalue (preserves reference)
TargetFunction(std::forward<T>(arg));
}Without std::forward, named rvalue references inside functions are treated as lvalues, causing accidental copies instead of moves!