右值引用就這麼簡單

2021-10-07 08:19:03 字數 1402 閱讀 9753

完美**

此處略去1000個字

簡而言之:

1.等號左邊的是左值,等號右邊的是右值

2.++i是左值,i++是右值

3.a+b是右值 ,所以fun(x)也是右值。

4.無名是右值。

其中道理只可意會,不可言傳

用乙個比喻來形容,那就是偷天換日,偷梁換柱。

move的意思就是把那個值偷過來。

我這兒有乙個程式,很生動形象

a *a = new a(1);

unique_ptrup1(a);

unique_ptrup2 = move(up1);

cout << up1<

這裡的move操作就是一招偷天換日。

up1變成了null。它的值被up2偷了。

所以用move取代了拷貝的操作,效率大大提高。

省去了暫存器重新寫回記憶體的時間。這張來自

什麼叫做減少了拷貝操作

for(int i=0;i<1000;i++)
mystring(「hello」)是臨時物件,當push_back的時候要呼叫拷貝建構函式生成乙個長期的物件

// 移動建構函式

mystring(mystring&& str) noexcept

:m_data(str.m_data)

用了移動建構函式就能把臨時物件換成長期的物件,不用拷貝。

有些左值是區域性變數,生命週期也很短,能不能也移動而不是拷貝呢?

mystring tmp("hello");

vecstr2.push_back(std::move(tmp)); //呼叫的是移動建構函式

void myforward(int&& i)
int&& i能自動型別推斷完美**void printt(t && t)

void printt(t& t)

void test(t && v)

對於上述**,很容易讓人誤以為呼叫test函式將會列印出"rvalue",但實際上結果為列印出"lvalue",因為在test函式中,將變數v傳遞為printt函式時,已經為變數v開闢了空間,則此時v為左值,故列印出"lvalue",要列印"rvalue"則需要呼叫forward()。

ERP就這麼簡單

訂貨意向 妻子 當然可以,來幾個人,幾點來,想吃什麼菜?丈夫 6個人,我們7點左右回來,準備些酒 烤鴨 番茄炒蛋 冷盤 蛋花湯。你 看可以嗎?商務溝通 妻子 沒問題,我會準備好的,訂單確認 妻子記錄下需要做的選單 mps計畫 具體要準備的菜 鴨 酒 番茄 雞蛋 作 油。bom物料清單 發現需要 1只...

氣泡排序就這麼簡單

在我大一的時候自學c語言和資料結構,我當時就接觸到了氣泡排序 當時使用的是c語言編寫的 現在大三了,想要在暑假找到乙份實習的工作,又要回顧一下資料結構與演算法的知識點了。排序對我們來說是一點也不陌生了,當你打王者榮耀的時候也會有段位之分,當你打dota的時候也有天梯分。從高往下數,這個排名是有規律的...

選擇排序就這麼簡單

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始 末尾 位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動...