int x = 34;
int &lRef = x;
&
符號來指示的,它出現在型別與變數的識別符號之間,這種型別的參照稱為左值參照。int square(int a) { return a * a; } int main() { int x = 0; // 1 x = 12; // 2 cout << x << endl; // 3 x = square(5); // 4 cout << x << endl; // 5 return 0; }在該程式中,x 是一個左值,這是因為 x 代表一個記憶體位置,它可以被程式的其他部分存取,例如上面註釋的第 2、3、4 和 5 行。
&
符號(&&),以下程式碼使用了右值參照列印了兩次 5 的平方:int && rRef = square(5); cout << rRef << endl; cout << rRef << endl;有意思的是,宣告一個右值參照,給一個臨時記憶體位置分配一個名稱,這使得程式的其他部分存取該記憶體位置成為了可能,並且可以將這個臨時位置變成一個左值。
int x = 0;
int && rRefX = x;
int && rRef1 = square(5);
在初始化完成之後,這個包含值 square(5) 的記憶體位置有了一個名稱,即 rRef1,所以 rRef1 本身變成了一個左值。這意味著後面的這個初始化語句將不會編譯:int && rRef2 = rRef1;
究其原因,就是右側的 rRef1 不再是一個右值。綜上所述,臨時物件最多可以有一個左值參照指向它。如果函數有一個臨時物件的左值參照,則可以確認,程式的其他部分都不能存取相同的物件。