C 右值引用與移動操作

2022-08-28 18:48:10 字數 860 閱讀 5687

右值引用和移動操作是c++11提出的新概念,通過這些操作,可以降低拷貝操作帶來的消耗。先來簡單介紹一下左值和右值。

左值一般指的是乙個物件,或者說是乙個持久的值,例如賦值的返回值、下標操作、解引用以及前置遞增等。

右值是乙個短暫的值,比如乙個表示式的求值結果、函式返回值以及乙個字面值等。

為了區分,把一般的引用稱為左值引用,必須繫結到右值的引用稱為右值引用,以&&表示。右值引用有這兩個特性:

右值引用只能繫結到臨時物件,所引用的物件將要被銷毀,並且沒有其他使用者

這也意味著,我們可以自由地接管引用物件的資源。

通常乙個變數可以認為是左值,也即是乙個物件。那麼如何獲得右值呢?可以顯示轉換為對應的右值引用,也可以呼叫標準庫函式std::move()。

move()承諾了我們不再使用移後源,不保證移後源的狀態和值。

實際上,移動操作竊取了物件資源的控制權,從而避免了不必要的拷貝。

int i = 1

;int&& rr = std::move(i);

移後源物件必須是可以析構的,並且要保證物件依然有效,可以被賦予新值,但是不保證移後源物件中留下的值。

事實上,單純呼叫std::move()並不會對物件進行改變,只有另外乙個物件接管了資源後,移動才真正完成。

<>在模板操作中詳細解釋了std::move的具體實現和工作。

templatetypename remove_reference::type&& move(t&&t)

move的引數是乙個t&&,而任何有名字的引數實際上都是左值。也就是說,這個引數可以和任何型別的引數匹配,可以傳左值也可以傳右值。

C 右值引用與移動構造

c 中提供了兩種引用方式。左值引用與右值引用。其中右值引用是c 11的新標準新增的內容。所謂的右值引用就是必須繫結到右值的引用。在介紹之前,先說明一下c 中的左值和右值的規定。實際上,最早在c語言中就有了左值和右值之分。最初的左值即指在賦值號左邊的變數,右值指在賦值號右邊的變數。隨著c語言的發展和c...

C 左值引用與右值引用

我們平常說的引用,一般來說都會預設為左值引用。即為某乙個物件起一別名,是間接訪問的一種實現方式。引用有許多的作用,例如傳參中避免發生拷貝,在一定程度上我們可以提公升效能。又例如傳參時,實參為陣列,我們知道陣列是不能整體拷貝,故我們也可以通過引用來實現。左值,右值 左值,右值都是表示式的屬性。c 中的...

C 右值引用與左值引用

意義 可以避免無謂的複製,提高程式的效能。左值 表示式結束後依然存在的持久化物件 右值 表示式結束後不再存在的臨時物件 所有的具名變數和物件都是左值,而右值不具名。區分左值和右值的快捷方法 看能不能對表示式取位址,如果能則是左值,否則就是右值。右值分為純右值和將亡值。純右值是c 98中的右值概念,如...