lvalue: 具有存儲性質的對象,即lvalue對象,是指要實際占用內存空間、有內存地址的那些實體對象,例如:變量(variables)、函數、函數指針等。
rvalue:相比較於lvalue就是所謂的沒有存儲性質的對象, 也就是臨時對象。
也可以這樣理解:
lvalue: 通過它能夠找到內存中存放的變量(location value),位於賦值運算符左,可以賦值。
rvalue:存放在lvalue對應的內存中的東西(register value), 位於賦值運算符左,不可賦值。
對左值和右值的一個最常見的誤解是:等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表達式而言的,左值是指表達式結束後依然存在的持久對象,右值是指表達式結束時就不再存在的臨時對象.
例如:
int a = 10; int b = 20; int *pFlag = &a; vector<int> vctTemp; vctTemp.push_back(1); string str1 = "hello "; string str2 = "world"; const int &m = 1;
請問,a,b, a+b, a++, ++a, pFlag, *pFlag, vctTemp[0], 100, string("hello"), str1, str1+str2, m分別是左值還是右值?、
再例如:
int a = 5;
變量a的存儲空間是 &a (a的lvalue), 存儲空間&a上的值為5(a的rvalue).
再看一個例子:
int* p = NULL; p = new int(5);
對於p: lvalue為&p(p的地址), rvalue為&p地址上的值.
對於*p: lvalue為p(*p的地址),rvalue為p地址上的值.
有了這些,對於 左值引用就比較好理解了.