1. 程式人生 > >左值,右值和引用

左值,右值和引用

  • 左值與右值
    • 左值是長久存在的值, 如 arr, arr[x], *pt
    • 右值是臨時存在的值, 如 x+y, “foo", 2
      • 函式的返回值如果不是返回引用的話也是右值,不可賦值給一個左值引用
    • 最簡單的判斷方式就是能否用取地址符&操作
    • 無法對右值進行更改操作,也無法對右值賦值
  • 引用
    • 宣告時在變數的型別後放置一個&來進行。如string& rstr= str;
    • 注意不能將一個右值賦值給左值引用, 如string& rstr = str + "hello";
    • 用途
      • 給一個結構複雜的名稱起別名
        • auto& whichList = lists[ myhash(x, lists.size() ) ]
        • auto 後一定要加&符號, 否則解讀為拷貝
      • 範圍for迴圈
        • for(auto x : arr) x++; 是不行的, 因為x是拷貝的值,並不能改變arr中原來的值
        • for (auto& x : arr) x++; 可以,因為x此時是引用
      • 引用傳參
        • 無需將引數複製一份臨時變數
        • 如果不希望改變引數,可以使用常量引用
      • 返回值傳遞
        • 避免的返回值的複製
        • 不要返回對一個區域性變數的引用,一般是返回一個靜態變數的引用
        • 如果不想返回的變數在後面被改變,應該返回常量引用
        • 不能返回函式內部new分配的記憶體的引用
        • 今天看到一篇部落格講引用返回值,非常好:https://blog.csdn.net/u012814856/article/details/84099328
    • std::move(var)
      • 當你確定var不會再使用的時候,可以使用std::move(var)將var轉換成右值,一般當做引數傳遞,避免的不必要的複製