template<typename T>
void func(T&& tmpv){
cout << tmpv << endl;
return;
}
萬能引用:既能接受右值,又能接受左值
滿足以下條件,右值引用會變爲萬能引用:
a、必須是函數模板
b、必須是發生了模板類型推斷並且函數模板形參的樣子是:T&&;auto也存在萬能引用,以後再說。
T&& 就是萬能引用, 單獨的T不是萬能引用
萬能引用 和 右值引用 的區別:
1、右值引用得傳遞右值,否則編譯器報錯;
2、萬能引用做函數形參時,既可以給他傳遞右值,又可以給它傳遞左值。
如果我們傳遞進去了右值,那麼這個萬能引用就變成了了右值引用。
如果我們傳遞進去了左值,那麼這個萬能引用就變成了了左值引用。
template <typename T>
void func(vector<T>&& tmpv){ //此處是右值引用
}
只有T後直接加 && 纔是萬能引用
萬能引用的剝奪:
1、const修飾符會剝奪一個引用稱爲萬能引用的資格。
template<typename T>
void func(const T&& tmpv){ //此處 T&&不再是萬能引用
cout << tmpv << endl;
return;
}