C++11 中引入的 delete 描述符主要有如下兩個使用場景:
禁止編譯器自動生成拷貝
Effective C++中提到

通過“私有化 + 只宣告、不定義” 的方法禁止編譯器生成某些拷貝建構式、拷貝運算子等,
在C++11及以后,可以通過delete描述符來實作,
classno_copies
{
public:
no_copies(){}
no_copies(no_copiesconst&) =delete;
no_copies&operator=(no_copiesconst&) =delete;
};
可以為任意函式使用 delete 描述,表明其不可用
較“私有化+只宣告不定義”的方式相比,將連接錯誤轉移到編譯錯誤

拷貝構造和拷貝賦值操作洗掉后,需要顯式寫一個移動建構式和移動賦值運算子,
如果你在學習C/C++的程序中遇到了問題,可以來加入小編的企鵝圈問小編哦~小編很熱情的(●’?’●)
只移動的類,移動構造:
classmove_only { std::unique_ptrdata; public: move_only(constmove_only&) =delete; move_only(move_only&& other): data(std::move(other.data)) {} move_only&operator=(constmove_only&) =delete; move_only&operator=(move_only&& other) { data=https://www.cnblogs.com/maoju/p/std::move(other.data); return*this; } }; move_only m1; move_onlym2(m1);// 錯誤,拷貝構造宣告為“已洗掉” move_onlym3(std::move(m1));// OK,找到移動建構式
洗掉特定的多載
如:函式需要 short 作為引數,禁止擴展為 int 型別
voidfoo(short);
voidfoo(int)=delete;
結果會這樣:
foo(42);// 錯誤,int多載宣告已經洗掉
foo((short)42);// OK

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/225530.html
標籤:C++
