C 11的新特性 右值引用

2022-03-11 19:17:45 字數 1970 閱讀 3137

先看**

#include "pch.h"

#include #include using namespace std;

template class myarray

//void pushback(t&& data);

private:

int mcapacity;

int msize;

elemtype *paddr;

};template myarray::myarray(int capacity)

template elemtype& myarray::operator(int index)

else }

templatevoid myarray::pushback(elemtype& data)

else }

templatemyarray::myarray(const myarray& arr)

}templatemyarray::~myarray()

}templatemyarraymyarray::operator=(const myarray& arr)

this->mcapacity = arr.mcapacity;

this->msize = arr.msize;

//申請記憶體空間

this->paddr = new elemtype[this->mcapacity];

//資料拷貝

for (int ix = 0; ix < this->msize; ++ix)

return *this;

}void test01()

}int main()

**模擬了stl中的array容器,編譯**,報錯

報錯的**為

marray.pushback(100);

marray.pushback(200);

pushback()的實現如下

templatevoid myarray::pushback(elemtype& data)

else

}

其引數為引用,不能對右值取引用,也就是說

int i = &42;
這行**是錯誤的。

//不能對右值取引用

//左值 可以在多行使用

//右值 即臨時變數,只能在當前行使用

marray.pushback(100);

marray.pushback(200);

解決辦法:過載pushback()函式

templatevoid myarray::pushback(elemtype && data)

else

}

另:在vs2017開發環境中,將pushback()的函式實現如下

void pushback(const elemtype& data);    //類內宣告

template//類外實現

void myarray::pushback(const elemtype& data)

else

}

這樣在使用pushback()時,編譯不會報錯

marray.pushback(100);

marray.pushback(200);

但在linux下,gcc版本為4.4.6,即便是寫為

void pushback(const elemtype& data);    //類內宣告
編譯器仍舊會報錯。

C 11中的新特性右值引用

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

C 11新特性 移動語義和右值引用

傳統的c 引用 左值引用 使得識別符號關聯到左值。左值是乙個表示資料的表示式 如變數名或解除引用的指標 程式可以獲得其位址。c 11新增了右值引用。右值引用,顧名思義,可以關聯到右值,即 可以出現在賦值表示式的右邊,但不能對其應用位址運算子的值。右值包括字面常量 c風格字串除外,它表示位址 諸如x ...

C 11 特性 左值 右值 右值引用 詳解

在c 11中所有的值必屬於左值 右值兩者之一,右值又可以細分為純右值 將亡值。在c 11中可以取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值 將亡值或純右值 舉個例子,int a b c,a就是左值,其有變數名為a,通過 a可以獲取該變數的位址 表示式b c 函式int func...