今天看C++模板的資料,裏面說到lvalue,rvalue的問題,這個問題之前也看到過,也查過相關資料,可是沒有考慮得很深,只知道rvalue不能取地址,不能賦值等等一些規則。今天則忽然有了更深層次的理解(也能夠說是頓悟,耗時不過幾秒鐘),記錄下來。函數
下面是我對這兩個單詞字面的意思的猜想:this
接下來是我所悟到內容的詳細分析spa
訪問lvalue必定會致使CPU訪問存儲器(相對較慢的操做)。.net
lvalue的例子:指針
rvalue是不能夠賦值的,它不是一個變量,在內存中沒有存在,沒有地址。它要麼是存在於CPU的寄存器中,要麼是存在於指令中(當即數)。因此只要對rvalue取地址,那麼就必定是錯誤的(編譯器會抱怨的)。對象
訪問rvalue不會致使CPU訪問存儲器(對當即數和寄存器的訪問很快)。blog
rvalue的例子:ip
帶着疑問,我查了查vc編譯出來的代碼,原來obj這個局部變量的地址被壓入了堆棧,foo函數內部以堆棧上的obj地址做爲this指針調用了UDT的構造函數。噢,難怪執行UDT obj = foo();這個語句只有調用了一次構造函數,而沒有調用operator =,這都是由於函數返回值必須是rvalue這個規則所帶來的好處,若是返回值是一個lvalue,那麼這個語句必定會調用operator = 運算符。內存
文章來自:http://blog.csdn.net/rogerhe/article/details/6410993get