1. 程式人生 > >C++ 11之 && 右值引用

C++ 11之 && 右值引用

最近在看cocos2dx的原始碼,發現了一個模板類有一個奇怪的語法&&:
 inline RefPtr(RefPtr<T> && other)
    {
        _ptr = other._ptr;
        other._ptr = nullptr;
    }
剛開始一陣犯暈,一個型別Ref<T>和一個似乎是形參的other與操作會得出一個什麼?顯然這種理解是錯誤的。。
“&&”還有一種含義是右值引用,表示形參是一個右值。
**左值 右值:**
int a = 0;
a是一個左值,左值是一個變數,可以被引用和多次使用。0是一個右值,不可以被引用。
左值一般是非臨時變數,可以多次使用。右值只在當前表示式有效。
看一下右值引用的用法:
class MyClassB
{
public:
    void init(int & intval)
    { cout<<"use & print"<<endl;};
    void init(int &&intval)
    { cout<<"use && print"<<endl;}
};
int main(void)
{
    int ae = 10;
    MyClassB().init(10);
    MyClassB().init(ae);
    return 0;
}

這裡寫圖片描述
可以看出,傳入不同型別的值,編譯器自動識別呼叫了不同的函式。
右值引用是用來支援轉移語義的。轉移語義可以將資源 ( 堆,系統物件等 ) 從一個物件轉移到另一個物件,這樣能夠減少不必要的臨時物件的建立、拷貝以及銷燬,能夠大幅度提高 C++ 應用程式的效能。臨時物件的維護 ( 建立和銷燬 ) 對效能有嚴重影響。