از std::forward برای prefect forwarding استفاده میشه کاری هم که می کنه ایته که اگر مقدار ورودی lvalue نباشه rvalue refrence بر می گردونه در غیر این صورت همون lvalue
پیاده سازیشم بر اساس قواعد universal refrence , تبدیل داده به داده مورد نظر هستش .( هر ۲ مورد رو داخل لینک پایین توضیح دادم)
static_cast<T&&>(t)
مثال زیر رو ببین :
void func(const int&)
{
cout<<"in lvalue\n";
}
void func(int&&)
{
cout<<"in rvalue\n";
}
template<class T>//universal refrence
auto myForward(T&& v)->decltype(static_cast<T&&>(v))
{
return static_cast<T&&>(v);
}
int main()
{
int i=2;
func(myForward(i));
func(myForward(2));
}
خروجی :
in lvalue
in rvalue
در مورد perfect forwarding , universal refrence لینک زیر رو ببین :
http://www.7khatcode.com/43/%D9%85%D9%86%D8%B8%D9%88%D8%B1-%D8%A7%D8%B2-move-semantics-%D8%AF%D8%B1-c-11-%DA%86%DB%8C%D9%87-%D8%9F