禁止拷贝与只移动类型的设计(Move-only Type)
如何设计一个只移动(Move-Only)类型?为什么std::unique_ptr是典型的move-only类型?如何禁用拷贝构造和拷贝赋值?移动构造和移动赋值应如何声明?
回答
孤独的心
Move-only类型设计:删除拷贝构造函数和拷贝赋值操作符,同时定义移动构造函数和移动赋值操作符。方法:MyClass(const MyClass&) = delete; MyClass& operator=(const MyClass&) = delete; MyClass(MyClass&&) noexcept = default; MyClass& operator=(MyClass&&) noexcept = default;。为什么unique_ptr是move-only:unique_ptr拥有资源的独占所有权,语义上不允许复制(否则两个指针会同时释放同一内存)。移动时,源指针置空,所有权转移。规则:①移动构造函数/赋值应标记noexcept(否则vector不会使用其移动操作);②移动后源对象必须处于可析构的合法状态;③通常将源指针设为nullptr。应用:线程所有权(thread)、unique_ptr、fstream、需要独占资源的对象。C++17的std::move_only_function专门接收move-only可调用对象。