C/C++基础进阶篇:C++11 中引入的 delete 描述符使用场景

159 阅读1分钟

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