C 中11的新特性move與右值

2021-10-22 04:40:17 字數 1268 閱讀 9576

什麼是左值什麼是右值;

左值:指表示式結束後依然存在的持久化物件

右值:指表示式結束後就不在存在的臨時物件

右值引用:

繫結到右值的引用,用&&來獲得右值的引用,右值引用只能繫結到要銷毀的物件,為了與右值引用區別開,常規的引用叫做左值引用;

int var= 12;

int &_var1 = var;

int &&_var2 = var; //錯誤不能將持久化物件繫結到右值引用上

int &&_var3 = var; //可以左邊的是零時變數,用完即銷毀。

左值與右值的區別:

void print_left_val(int &val)

void print_right_val(int&& val)

void test_05()

怎麼將左值轉換成乙個右值呢?

這時我們可以使用move函式

以下是move函式的實現原理:

template typename remove_reference::type&& move(t&&

t)實際就是乙個強制型別的轉換

std::move是將物件的狀態或者所有權從乙個物件轉移到另乙個物件,只是轉移,沒有記憶體的搬遷或者記憶體拷貝所以可以提高利用效率,改善效能.。

例如:當我們使用stl庫中的vector中的push_back進行新增資料,會複製乙份資料到vector中。會影響到vector的效能。我們可以使用move函式進行狀態轉移。

std::string str = 「hello」; std::vectorstd::string v;

//呼叫常規的拷貝建構函式,新建字元陣列,拷貝資料 v.push_back(str); std::cout << 「after

copy, str is 「」 << str << 「」\n」; //呼叫移動建構函式,掏空str,掏空後,最好不要使用str

v.push_back(std::move(str)); std::cout << 「after move, str is 「」 <<

str << 「」\n」; std::cout << 「the contents of the vector are 「」 <<

v[0]<< 「」, 「」 << v[1] << 「」\n」;

該**與作者傍風無意:

C 11中的新特性右值引用

右值引用 rvalue referene 是 c 新標準 c 11,11 代表 2011 年 中引入的新特性 它實現了轉移語義 move sementics 和精確傳遞 perfect forwarding 它的主要目的有兩個方面 1.消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。...

C 11 右值引用與move語義

1.右值引用 1.1 右值 右值就是指在下乙個分號後 更準確的說是在包含右值的完整表示式的最後 銷毀的臨時物件。對於c 11,編譯器會依據引數是左值還是右值在複製建構函式和move建構函式間進行選擇。怎樣區分呢?the distinguishing criterion is if it has a ...

C 11的新特性 右值引用

先看 include pch.h include include using namespace std template class myarray void pushback t data private int mcapacity int msize elemtype paddr templa...