3

我有一个简单的 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?我想知道它是否会过多地删除一个引用并导致创建不必要的临时对象。

4

1 回答 1

13

显然我确实需要删除或正确实施它,因为我刚刚学会了艰难的方式。

不,你没有。

您的类具有用户定义的复制构造函数、复制赋值运算符和析构函数,因此编译器不会为您定义移动赋值运算符。

所以停止尝试删除它,类将被复制而不是移动。

使用已删除的移动操作,您无法复制该类型的右值,即,将其用作值类型变得极其困难(包括在容器中)。没有移动操作,它只会做一个右值的深拷贝,这是安全的,可能是你想要的。

仅当您希望类完全不可移动和不可复制时,删除移动操作才有意义,例如,像互斥体类型,其中对象身份至关重要,而不是其值。拥有带有已删除移动的可复制类型是毫无意义的。

于 2016-01-18T13:43:38.600 回答