std::forward必须配合模板参数类型使用,因为它依赖显式提供的t类型决定转发为左值或右值;若t推导错误(如用decltype(x)替代t),则折叠规则失效,导致无法完美转发。
std::forward 为什么必须配合模板参数类型使用
因为 std::forward 的行为完全取决于你传给它的类型参数——它不是靠实参推导,而是靠你显式写的那个 T&& 是“左值引用”还是“右值引用”来决定是否真的转发为右值。写错类型,转发就失效。
常见错误现象:std::forward 后对象没被移动、拷贝构造被调用、性能没提升,甚至编译失败(比如对非引用类型调用)。
- 必须用在函数模板中,且形参是
T&&形式(万能引用/转发引用) - 调用
std::forward<t>(x)</t>时,T必须和模板形参类型一致;不能写成std::forward<decltype>(x)</decltype>—— 那会强制变成右值,破坏转发语义 - 如果
T是int&,std::forward<int>(x)</int>返回int&&→ 折叠为int&→ 左值转发 - 如果
T是int(即实参是右值),std::forward<int>(x)</int>返回int&&→ 真正触发移动
完美转发失效的三个典型场景
所谓“完美”,是指保留原始实参的值类别(左值/右值)和 cv 限定(const/volatile)。但很多写法会悄悄破坏它。
常见错误现象:函数内对参数取了地址、赋给了非引用变量、用了 auto 而没加 &、或中间套了一层非模板函数。
立即学习“C++免费学习笔记(深入)”;