C++11 中引入的 delete 描述符主要有如下两个使用场景:
禁止编译器自动生成拷贝
Effective C++ 中提到
通过“私有化 + 只声明、不定义” 的方法禁止编译器生成某些拷贝构造函数、拷贝操作符等。
在C++11及以后,可以通过 delete
描述符来实现。
class no_copies
{
public:
no_copies(){}
no_copies(no_copies const&) = delete;
no_copies& operator=(no_copies const&) = delete;
};
可以为任意函数使用 delete 描述,表明其不可用
较“私有化+只声明不定义”的方式相比,将连接错误转移到编译错误
拷贝构造和拷贝赋值操作删除后,需要显式写一个移动构造函数和移动赋值操作符,
只移动的类,移动构造:
class move_only
{
std::unique_ptr data;
public:
move_only(const move_only&) = delete;
move_only(move_only&& other):
data(std::move(other.data))
{}
move_only& operator=(const move_only&) = delete;
move_only& operator=(move_only&& other)
{
data=std::move(other.data);
return *this;
}
};
move_only m1;
move_only m2(m1); // 错误,拷贝构造声明为“已删除”
move_only m3(std::move(m1)); // OK,找到移动构造函数
删除特定的重载
如:函数需要 short 作为参数,禁止扩展为 int 类型
void foo(short);
void foo(int) = delete;
结果会这样:
foo(42); // 错误,int重载声明已经删除
foo((short)42); // OK
也可以继承boost中的nocopyable来实现禁止拷贝
不错