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