先看**
#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...