右值引用的意義

2021-10-24 01:47:05 字數 668 閱讀 6386

首先理解深拷貝和淺拷貝:

以字串string為例,我們知道string內維護了乙個char指標,指向乙個堆物件。所謂的深拷貝,就是在拷貝的時候複製這個char指向的堆物件,所謂的淺拷貝就是不複製,直接用char*指標指向這個堆物件,這時候就會導致兩個指標指向同乙個物件,當乙個string物件析構的時候,會把堆物件釋放掉,而另乙個string物件不知情,從而導致不可知的後果。

所以一般字串的拷貝我們需要採用深拷貝,即將堆物件複製一遍。

但是若此時傳入的是乙個右值,而不是乙個左值呢?若在這種情況下,右值最終也會釋放掉,那為什麼不直接接管它的資源呢(所謂接管,也就是b string的char指標指向這個堆物件,a string的char指標指向null)?於是,我們可以定義乙個引數為右值的建構函式,在裡面接管右值的資源。那麼問題又來了,把函式引數宣告為右值,那麼呼叫函式的時候還得構造出乙個臨時變數,作為引數。那我能不能不構造出這個臨時變數呢?可以,那就把它宣告為引用,那就不會有多餘的臨時變數了,這也就引出了右值引用,把右值引用作為函式引數,這就少了一次臨時變數的構造的過程。

那麼std::move()的作用體現在哪呢?它的作用是把乙個左值變成乙個右值引用,從而讓另乙個物件來接管它的資源,呼叫了std::move()說明你已經把這個變數看成是乙個右值了,而右值意味著你再也不需要了,因此對乙個左值呼叫了std::move(),那麼就再也不要用這個值了。

左值 右值 左值引用 右值引用

2015 06 01 15 07 404人閱讀收藏 舉報 c 11 5 一 c 中的左值和右值 誤區 左值位於等號左邊,右值位於等號右邊。c 11中的定義 左值表示式表示的是乙個物件的身份 在記憶體中的位置 而右值表示式表示的是物件的值 內容 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...