## 左右值引用[參考文獻1:一文讀懂C++右值引用和std::move](https://zhuanlan.zhihu.com/p/335994370)基本區(qū)分:有地址的變量是左值,沒地址的字面值臨時值及時右值**左值引用**const int& a 的使用場景 這個被稱為const左值引用,特性:通過該引用建立的變量,無法進行修改,因此可以將該引用綁定到臨時變量上。```void push_back(int &a);int a = 4;對于vec.push_back(4); 就會出現(xiàn)int &a = 4;這種左值引用指向右值的問題,會編譯失敗const左值引用不會修改指向值void push_back(const int &a) 則會避免這種情況```**右值引用** 右值引用專門為右值而生,可以指向右值,不能指向左值```int &&ref_a_right = 5; // ok int a = 5;int &&ref_a_left = a; // 編譯不過,右值引用不可以指向左值 ref_a_right = 6; // 右值引用的用途:可以修改右值```使用場景:移動構(gòu)造(a=b,b的復(fù)制給a后同時刪除b,這就不得不使用右值引用了)**std::move()**該函數(shù)會將左值強制轉(zhuǎn)換為右值,讓右值引用可以指向左值,同時move的變量會失去原有值```1. 從性能上講,左右值引用沒有區(qū)別,傳參使用左右值引用都可以避免拷貝。2. 右值引用可以直接指向右值,也可以通過std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。3. 作為函數(shù)形參時,右值引用更靈活。雖然const左值引用也可以做到左右值都接受,但它無法修改,有一定局限性。```const 在修飾返回值時可以起到保護的左右explicit 是對于構(gòu)造函數(shù)的修飾,防止隱式轉(zhuǎn)換,保證vector (4), 防止 vector a = 4;