C 程式設計高階 右值引用

2021-10-24 08:53:11 字數 2367 閱讀 6438

右值引用(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 中,乙個變數是左值還是...