std::forward与std::move的区别本质
std::move和std::forward都返回引用类型,它们的本质区别是什么?为什么说forward是条件转换而move是无条件转换?在什么场景中必须用forward而不能用move?
回答
我还是少年
std::move:无条件将实参转换为右值引用(static_cast<T&&>(t))——告诉编译器"这个对象可以窃取"。std::forward:条件转换——仅在模板参数T为左值引用时返回左值引用,否则返回右值引用(static_cast<T&&>(t),利用引用折叠)。当T是int&→int& &&→int&(左值);T是int&&→int&&(右值)。本质:move表示"我放弃所有权";forward表示"我以原始类别转发"。必须用forward的场景:转发引用模板中保留参数值类别——template<typename T> void wrapper(T&& arg) { foo(std::forward<T>(arg)); }。如果用move,左值参数也被强制转为右值,导致资源被意外窃取。常用口诀:forward转发,move移动;右值参数用move,转发引用用forward。