右值引用(rvalue reference),是c++程式語言自c++11標準提出的一類資料型別。用於實現移動語義(move semantic)與完美**(perfect forwarding)
作為一種追求執行效率的語言,c++在用臨時物件或函式返回值給左值物件賦值時的深度拷貝(deep copy)一直受到詬病。考慮到臨時物件的生命期僅在表示式中持續,如果把臨時物件的內容直接移動(move)給被賦值的左值物件,效率改善將是顯著的。這就是移動語義的**.
與傳統的拷貝賦值運算子(copy assignment)成員函式、拷貝構造(copy ctor)成員函式對應,移動語義需要有移動賦值(move assignment)成員函式、移動構造(move ctor)成員函式的實現機制
右值引用就是為了實現移動語義與完美**所需要而設計出來的新的資料型別。右值引用的例項對應於臨時物件;右值引用並區別於左值引用,用作形參時能過載辨識(overload resolution)是呼叫拷貝語義還是移動語義的函式。
-xvalue
xvalue是接近生命週期末尾的lvalue.程式設計人員需要顯式地進行強制轉換std::move(x)
,告訴編譯器x不再訪問,std::move(x)
表示式的結果是乙個xvalue
move常見錯誤
class
test
private
:value_1_;
value_2_;
};
class
test
explicit
test
(string&& t)};
const string s=
"hahah"
;test t
(move
(s))
;
此時的move
是無效的,因為s是個const變數,當使用move
,const string&&
型別,此時沒有直接匹配的,編譯器將其強制變為const string&
最終呼叫第乙個建構函式構造.
move的效果取決於物件movr建構函式的實現.
比如:
int i_1=
100;
int i_2=
move
(i_1)
;//其效果就是i_2=i_1,i_1的值不變.
//對於shared_ptr物件
shared_ptr<
int> pt1=make_shared<
int>
(100);
shared_ptr<
int> pt2=
move
(pt1)
;//其效果是pt2或的pt1所指的物件,pt1指向空
//對於string物件
string str1=
"hahah"
string str2=
move
(str1)
;//其效果就是相當於s1和s2交換,str2並不一定指向空
string foo()
string foo
(string s)
shared_ptr<
const string>
foo(
)shared_ptr<
const string>
foo(shared_ptr p)
上面的move
是必要的,如果沒有move
,引用計數加1再減1;
move後,引用計數不會發生變化
move操作帶來的問題.
如果乙個函式想接受兩個string型別的引數,它得寫四個函式:
void
process
(const string& str1,
const string& str2)
;void
process
(const string& str1,string&& str2)
;void
process
(string&& str1,
const string& str2)
;void
process
(string&& st1,string&& str2)
;
如果想接受3個,或者4個引數的話,它豈不是得寫6個,24個?
如何解決這一問題?
請待下回分解,c++之完美**
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...
C 左值 右值 左值引用 右值引用
就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...