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=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