C++11 中的 delete 使用场景

C++11 中引入的 delete 描述符主要有如下两个使用场景:

禁止编译器自动生成拷贝

Effective C++ 中提到

通过“私有化 + 只声明、不定义” 的方法禁止编译器生成某些拷贝构造函数、拷贝操作符等。

在C++11及以后,可以通过 delete 描述符来实现。
[cpp]
class no_copies
{
public:
no_copies(){}
no_copies(no_copies const&) = delete;
no_copies& operator=(no_copies const&) = delete;
};
[/cpp]

可以为任意函数使用 delete 描述,表明其不可用
较“私有化+只声明不定义”的方式相比,将连接错误转移到编译错误

拷贝构造和拷贝赋值操作删除后,需要显式写一个移动构造函数和移动赋值操作符,
只移动的类,移动构造:
[cpp]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,找到移动构造函数
[/cpp]

删除特定的重载

如:函数需要 short 作为参数,禁止扩展为 int 类型
[cpp]
void foo(short);
void foo(int) = delete;
[/cpp]
结果会这样:
[cpp]
foo(42); // 错误,int重载声明已经删除
foo((short)42); // OK
[/cpp]

1 条评论

  1. 也可以继承boost中的nocopyable来实现禁止拷贝

  2. 不错

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫,分享到朋友圈

C++11 中的 delete 使用场景
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close