std::forward被称为完美转发,它的作用是保持原来的值属性不变。
如果原来的值是左值,经std::forward处理后该值还是左值;如果原来的值是右值,经std::forward处理后它还是右值。
forward实现原理
template <typename T>
T&& forward(typename std::remove_reference<T>::type& param)
{
return static_cast<T&&>(param);
}
template <typename T>
T&& forward(typename std::remove_reference<T>::type&& param)
{
return static_cast<T&&>(param);
}
引用折叠
将复杂的未知表达式折叠为已知的简单表达式
一旦定义中出现了左值引用,引用折叠总是优先将其折叠为左值引用