右值引用
是一種復合型別,跟c++的傳統引用很類似。為更準確地區分兩種型別,我們把傳統的c++引用稱為
左值引用
。而使用「引用」這一術語時,我們的意思同時包含兩種引用:左值引用和右值引用。
右值引用的行為跟左值引用類似,不同之處在於:右值引用可以繫結到臨時量(右值),而(非const的)左值引用卻不能繫結到右值。
究竟為何要使用右值引用?
右值引用和左值引用結合起來恰能方便地實現
轉移語義
。右值引用還可以用於實現完美**,這是c++裡面到現在都沒有解決的乙個問題。從一般程式設計師的角度來看,使用右值引用,我們得到的將是更加通用,效能也更高的庫
template swap(t& a, t& b)
拷貝的開銷可以很大。舉例來說,對於std::vector,像v2=v1這樣的賦值通常包含一次函式呼叫,一次記憶體分配和乙個迴圈。當我們確實需要乙個vector的兩份拷貝時,這當然是可接受的,然而很多情況下我們並不需要:我們常常將乙個vector從乙個地方複製到另乙個地方,接著便覆寫了舊的版本
但我們並不想擁有a或b的任何拷貝,而只是想交換他們
template swap(t& a, t& b)
move()函式的實現在標頭檔案中
template
inline typename remove_reference<_tp>::type&& move(_tp&& __t)
move函式完成的工作實際上微乎其微。它所做的就是接受乙個左值或右值引數,然後將它作為右值返回而不引發拷貝構造:
c++11引入了兩個新的特殊成員函式:「移動」建構函式和「移動」賦值過載函式。
c::c(c&& other); 這個建構函式不應該申請新的資源,相當於auto_ptr的資源轉移
「移動」等號過載函式如下:
c& c::operator=(c&& other);//c++11 move assignment operator.
「移動"賦值過載函式和拷貝建構函式有一點類似,除了在執行賦值前,要把自己的資源釋放掉這一
#include#includetemplateclass stack
stack(int d);
stack(const stack&);
stack(stack &&);
stack &operator=(const stack &);
stack &operator=(stack &&);
~stack()
void push(t d);
void pop();
t &top();
inline size_t count();
friend ostream &operator<<(ostream &os,stack&s);
};templatestack::stack(int d)
templatestack::stack(const stack&s):data(copy(s.data,s.size,s.size)),size(s.size),used(s.used)
templatet *stack::copy(const t *src,size_t srcsize,size_t destsize)
catch(...)
return dest;
}templatestack::stack(stack&&s):data(s.data),size(s.size),used(s.used)
templatestack&stack::operator=(const stack&s)
return *this;
}templatestack&stack::operator=(stack&&s)
return *this;
}templatevoid stack::push(t d)
data[used++]=d;
}templatevoid stack::pop()
templatet &stack::top()
templatesize_t stack::count()
templateostream &operator<<(ostream &os,stack&p)
{ for(int i=p.used;i>=0;--i)
osfor(int i=10;i>=0;--i)
s.push(i);
//cout(s));
stacks2=static_cast&&>(s1);
//stack&&s3=s;
cout<<"s\n";
for(int i=s.count();i>0;--i)
{ cout<0;--i)
{ cout<0;--i)
{ cout<
C 11 右值引用
消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。能夠更簡潔明確地定義泛型函式。1.右值引用 int a a 1 here,a is an lvalue 上述的a就是乙個左值。c 11中左值的宣告符號為 為了和左值區分,右值的宣告符號為 printreference const str...
C 11右值引用
c 11中引入的乙個非常重要的概念就是右值引用。理解右值引用是學習 移動語義 move semantics 的基礎。而要理解右值引用,就必須先區分左值與右值。對左值和右值的乙個最常見的誤解是 等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物...
c 11 右值引用
最近看了祁宇大哥的深入應用c 11中的用c 11提高程式效能部分,對右值引用做乙個小讀後感悟及總結,其實右值引用沒想象的那麼神秘 c 11 增加了乙個新的型別,右值引用,標記為t c 11中所有的值必屬於左值 將亡值 純右值,其中將亡值和純右值屬於右值,比如,非引用返回的臨時變數 運算表示式產生的臨...