You should use std::forward with universal (forwarding) references when perfect forwarding is actually required, typically when passing the parameter to another function or constructor that depends on value category (e.g., distinguishing between lvalue/rvalue overloads or enabling move semantics). In your example, bothv f1 and f2 return the parameter, and auto return type triggers move semantics for rvalues anyway due to return value optimization (RVO), so is not strictly necessary here. However, using is good practice in generic code because it preserves the value category and avoids surprises if the function is later changed to forward its argument.