我有一个简单的RAII包装器来管理某个资源。这是界面:
struct ResourceWrapper
{
explicit ResourceWrapper(RESOURCE resource);
ResourceWrapper(const ResourceWrapper& other);
ResourceWrapper& operator=(const ResourceWrapper& other);
~ResourceWrapper();
ResourceWrapper(ResourceWrapper&& other) = delete;
ResourceWrapper& operator=(ResourceWrapper&& other) = delete;
};
这里的问题是,一旦我明确删除了移动赋值运算符,我就不能再使用带有std
容器和算法的类。显然我确实需要删除或正确实现它,因为我刚刚学到了很多东西。
另一种选择是通过常规赋值运算符实现移动赋值,但我不确定如何正确执行。我想我需要像std::remove_reference
这样的东西?我想知道它是否会删除一个太多的引用并导致创建不必要的临时对象。
答案 0 :(得分:12)
显然我确实需要删除或正确实施它,因为我刚刚学到了很多东西。
不,你没有。
您的类具有用户定义的复制构造函数,复制赋值运算符和析构函数,因此编译器将不为您定义移动赋值运算符。
因此,只需停止尝试删除它,该类将被复制而不是移动。
使用已删除移动操作,您无法复制该类型的rvalues,即使用它作为值类型(包括在容器中)变得非常困难。使用无移动操作,它只会执行rvalues的深层复制,这是安全的,可能是您想要的。
如果您希望该类完全不可移动且不可复制,则删除移动操作才有意义。类似于互斥体类型的东西,其中对象标识是关键的,而不是它的价值。具有已删除移动的可复制类型永远不会有意义。