可以将对象从向量A移至向量B,而不是从B转移到A

Can move object from vector A to vector B, but not from B to A?

本文关键字:向量 转移 对象      更新时间:2023-10-16

我有一个具有对象向量的类。所讨论的对象已删除复制构造函数和复制分配运算符,因此它们具有移动构造函数和移动分配运算符,以允许它们与向量一起使用。将对象保存的类具有附加和提取方法,该方法允许对象从缓冲区中将对象附加到"对象向量"或从类"对象向量向量向buffer提取到缓冲区的"对象向量。

对象定义看起来像这样:

struct MyObject
{
    int width_ = 0;
    int height_ = 0;
    //etc...
    stImage() = default; 
    stImage(int width, int height, ...)
    {
        width_ = width;
        height_ = height;
        //etc...
    }
    stImage(const stImage& rhs) = delete;
    stImage& operator= (const stImage & rhs) = delete;
    stImage(stImage&& rhs) : width_(0), height_(0), ...
    {
        *this = std::move(rhs);
    }
    stImage& operator=(stImage&& rhs)
    {
        if (this != &rhs)
        {
            width_ = rhs.width_;
            height_ = rhs.height_;
            //etc...
            rhs.width_ = 0;
            rhs.height_ = 0;
            //etc...
        }
        return *this;
    }
};

附加方法编译:

void MyClass::append(MyObject * buffer)
{
    data_.push_back(std::move(*buffer));
}
void MyClass::append(Vector<MyObject> * buffer)
{
    for (int i = 0; i < (*buffer).size(); i++) 
    {
        data_.push_back(std::move((*buffer)[i]));
    }
 }

但是,提取方法没有:

void MyClass::extract(it8 start, Length length, Vector<MyObject> * buffer) const
{
    for (it8 i = start; i < (start + length); i++) 
    {
        (*buffer).push_back(std::move(data_[i]));
    }
}

给出的错误是" C2280'MyObject :: myObject(const myobject&amp;)':尝试引用已删除的函数"

我看不出为什么这两个操作在功能上彼此不同。任何对提取物的失败和附加原因的见解都不会受到赞赏,并且一种使提取工作工作的方法将更加如此。

(注意:向量是STD :: vector的自定义实现,因为原因,但据我所知,它们的作用相同。如果这可能是问题,并且STD :: vector可以很好地适应在他们站立时附加/提取物,我想我会看看是否可以。)

extract是const成员函数,在const成员函数中,每个引用成员变量的参考均为const。当您访问data_[i]时,返回数据类型为const MyObject&

std::move只需将其输入到R值参考,在您的情况下,std::move的返回类型为 const MyObject&&,但是由于对象具有const限定符,因此push_back的选择过载将为push_back(const T&)

您可以使用const_castdata_中删除const,但这不是最好的解决方案。也可以使用mutable关键字,但是最好的解决方案是将您的函数声明为非const函数,因为它正在修改对象内部状态。

我想

constness。"提取"从data_中删除,因此不能const。