<1>普通左右值引用ide
int a = 0;函數
int&ref1 = a; //左值引用spa
int&&ref2 = a; //右值引用對象
<2>右值和左值引用基本沒什麼區別,差異是右值引用能夠綁定到一個臨時對象(右值)上,如:內存
int&x = int();//編譯錯誤it
Int&&y = int();編譯
<3>經過右值引用,程序能夠明確的區分出傳入的參數是否爲右值,從而避免了沒必要要的拷貝,程序的效率也就獲得了提升class
(1)普通交換數據:效率
template<class T> void swap(T& a, T& b)變量
{
T temp(a);//temp對象建立後有a的兩份拷貝
a = b;//b的值也有兩份,a一份
b = temp;//a如今也有兩份拷貝,b有一份
}
在對象比較大時,比較影響效率
(2)右值應用:
template<class T> T&& move(T&& x)
{
return x;
}
//這一過程不會產生拷貝操做
template<class T> void swap(T& a, T& b)
{
T temp(move(a));//對象a被移到temp中,a被清空
a = move(b);//對象b被移到a中,b被清空
b = move(temp);//對象temp被移到b中,temp被清空
}
<4>不要返回函數內部new分配的內存的引用,雖然不存在局部變量的被動銷燬問題,又面臨其它尷尬局面,函數返回的引用只是做爲一個臨時變量出現,而沒有被賦予一個實際的變量,那麼這個引用所指向的空間(由new分配)就沒法釋放,形成memory leak。