剛看到這時(shí),有一個(gè)疑問(wèn),好像 T && universal reference 已經(jīng)可以接受所有類(lèi)型的參數(shù)共缕,并且保持原來(lái)參數(shù)的類(lèi)型。為什么還要有forward呢士复。想明白后發(fā)現(xiàn) T && 轉(zhuǎn)發(fā)并不完美图谷,在轉(zhuǎn)發(fā)右值的時(shí)候會(huì)出問(wèn)題, 有如下例子
void foo(int&& foo_arg)
{
}
template<typename T>
void fwd(T&& fwd_arg)
{
foo(fwd_arg);//編譯錯(cuò)誤阱洪,需要forward<T>(fwd_arg)
}
int main(){
fwd(30);
}
當(dāng)傳入字面常量30便贵,模版參數(shù)T推導(dǎo)成 int ,模版實(shí)例化結(jié)果如下
void fwd(int&& fwd_arg) {
foo(fwd_arg);
}
雖然fwd_arg是的類(lèi)型是右值引用冗荸,但fwd_arg本身是左值,當(dāng)繼續(xù)給foo傳值的時(shí)候其實(shí)是一個(gè)int && 類(lèi)型的左值嫉沽。 就會(huì)產(chǎn)生編譯錯(cuò)誤
這個(gè)時(shí)候就要用,forward了俏竞,因?yàn)閒wd_arg本身是左值绸硕,foo的參數(shù)是個(gè)右值引用,無(wú)法綁定到一個(gè)左值上魂毁。
用forward<T>(fwd_arg)當(dāng)實(shí)參玻佩,T推斷成int&&,所以返回值是int&& &&,折疊成int&&席楚,可以被綁定到foo參數(shù)的右值引用上咬崔,就沒(méi)有錯(cuò)誤了
所以,universal reference 轉(zhuǎn)發(fā)時(shí)并不完美,只完美了一半垮斯,當(dāng)轉(zhuǎn)發(fā)目標(biāo)的的參數(shù)是右值引用時(shí)郎仆,會(huì)出現(xiàn)問(wèn)題。
std::forward 解決當(dāng)轉(zhuǎn)發(fā)目標(biāo)的的參數(shù)是右值引用時(shí)的問(wèn)題兜蠕∪偶。可以保持原始參數(shù)的類(lèi)型,將實(shí)參從原來(lái)的類(lèi)型為右值引用的左值熊杨,變成了本身就是右值引用