c 11 右值引用

2021-06-18 18:32:00 字數 2428 閱讀 9953

右值引用

是一種復合型別,跟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中所有的值必屬於左值 將亡值 純右值,其中將亡值和純右值屬於右值,比如,非引用返回的臨時變數 運算表示式產生的臨...