這三個概念都是c++11引入的概念,在此總結一些粗淺的理解。c++
Lvalue = expressions of which we can get memory address
Rvalues = expressions of which we can't get memory address
但是實現上爲了即使是右值表達式爲了求出其值依然須要分配一塊內存來存放這個值,這造成了一個臨時對象,即便以後沒有給這個對象取名,對象依然造成了,依然經歷了構造和析構的完整生命週期。
這是C++支持RAII以後的事情了。並且即使如今基本類型的右值表達式並不須要事先分配內存。
左右並不是是C/C++纔開始有的,而是當前計算機體系結構的客觀現實。原本,左值是內存上的變量(有地址),右值是隻在寄存器當中存在的值(沒有地址)。
這樣就好理解了吧。只不過有告終構體和對象概念以後,單個數據類型也可能大到沒法完整存放在寄存器當中,須要在棧或者堆(反正都是內存)上開額外空間臨時存放。再加上RAII的要求,因此才把事情搞那麼繞,那麼複雜。
其實若把這個臨時空間(scratch memory)看做寄存器的擴展,不屬於常規內存,那麼就好理解了。事實上C++從語法規定上禁止對右值取地址,即使它在內存上有位置。這就是告訴你,這片內存並非一般的內存,邏輯上它只是超大寄存器。
https://www.zhihu.com/questio...express
ok,右值能夠理解,那右值引用是什麼鬼?爲何要refer一塊在內存上可是無法取地址訪問的東西。c++98
中的引用很常見了,就是給變量取了個別名,咱們能夠經過解引用獲取到變量(對象),實際上這具體指的是左值引用函數