#include using namespace std ; class Object { public: Object() = default; void SetName(const string &name) { name_ = move(name); } string GetName() const { return name_; } private: string name_; }; void UseObject(Object& x1) { cout << "calling UseObject(Object &)" << endl; } void UseObject(const Object& x1) { cout << "calling UseObject(const Object &)" << endl; } void UseObject(Object&& x1) { cout << "calling UseObject(Object &&)" << endl; } template void NotForwardToUseObject(T x) { UseObject(x); } template void ForwardToUseObject(T &&x) { UseObject(static_cast(x)); } template void PerfectForwardToUseObject(T &&x) { //UseObject(forward(x)); UseObject( x ); } template void PerfectForwardToUseObject1(T &&x) { UseObject(forward(x)); } int main() { Object object; const Object const_object; cout << "----" << endl; PerfectForwardToUseObject(object); PerfectForwardToUseObject(const_object); PerfectForwardToUseObject(move(object)); PerfectForwardToUseObject1( Object() ); cout << "----" << endl; }