A.2 删除函数

    通常为了避免进行拷贝操作,会将拷贝构造函数和拷贝赋值操作符声明为私有成员,并且不进行实现。如果对实例进行拷贝,将会引起编译错误;如果有其他成员函数或友元函数想要拷贝一个实例,那将会引起链接错误(因为缺少实现):

    在C++11中,委员会意识到这种情况,但是没有意识到其会带来攻击性。因此,委员会提供了更多的通用机制:可以通过添加将一个函数声明为删除函数。

    这样的描述要比之前的代码更加清晰。也允许编译器提供更多的错误信息描述,当成员函数想要执行拷贝操作的时候,可将连接错误转移到编译时。

    拷贝构造和拷贝赋值操作删除后,需要显式写一个移动构造函数和移动赋值操作符,与std::threadstd::unique_lock<>一样,你的类是只移动的。

    清单A.2 只移动类

    只移动对象可以作为函数的参数进行传递,并且从函数中返回,不过当想要移动左值,通常需要显式的使用或static_cast<T&&>

    现在,任何向foo函数传递int类型参数都会产生一个编译错误,不过调用者可以显式的将其他类型转化为short: