C++ 專題 右值引用、移動語義與完美轉發

這三個概念都是c++11引入的概念,在此總結一些粗淺的理解。c++

右值與左值

  • 右值是什麼(左值)
    應該在c++98就有左右值的概念吧(不肯定我也懶得調研啊)。
    所謂左值右值,左值取址(地址),右值取值(數值)
    Lvalue = expressions of which we can get memory address
    Rvalues = expressions of which we can't get memory address
    左值refer to 內存中的某一具名對象,好比變量、函數參數、類對象
    右值主要是臨時對象,好比literals(字面值)、操做的臨時結果(a+b), 函數非引用返回的臨時對象,匿名對象...
  • 爲何要有右值
    如下內容來自某乎某高贊答案,爲防止失效,除了連接直接把原文也抄了過來

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

右值引用(與左值引用)

ok,右值能夠理解,那右值引用是什麼鬼?爲何要refer一塊在內存上可是無法取地址訪問的東西。
c++98中的引用很常見了,就是給變量取了個別名,咱們能夠經過解引用獲取到變量(對象),實際上這具體指的是左值引用函數

相關文章
相關標籤/搜索