可以将对象从向量A移动到向量B,但不能从B移动到A吗?

时间:2017-02-23 09:15:24

标签: c++ vector

我有一个具有对象矢量的类。有问题的对象已经删除了复制构造函数和复制赋值运算符,因此它们有一个移动构造函数和移动赋值运算符,以允许它们与向量一起使用。这个包含对象的类具有append和extract方法,允许将对象附加到类中。来自缓冲区的对象向量或从类中提取的对象。对象向量到缓冲区。

对象定义如下所示:

https://arubaitobsv.s3-ap-northeast-1.amazonaws.com/images/1487816629838-20170223_092312_HDR.jpg

追加方法编译:

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]));
    }
 }

给出的错误是&#34; C2280&#39; MyObject :: MyObject(const MyObject&amp;)&#39;:尝试引用已删除的函数&#34;

我无法理解为什么这两个操作在功能上有任何不同。任何关于为什么提取失败和追加的见解都不会被理解,并且提取工作的方法会更加如此。

(注意:这里的矢量是std :: vector的自定义实现,因为原因,但据我所知,它们的功能相同。如果这可能是问题,那么std :: vector将是很好的附加/提取,因为他们的立场,我想我会看到使用它是否可以。)

2 个答案:

答案 0 :(得分:3)

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

std::move只是将其输入转换为r值引用,在您的情况下,std::move的返回类型为const MyObject&&,但因为对象有const限定符push_back选择的重载将为push_back(const T&)

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

答案 1 :(得分:0)

Constness,我想。 &#39;提取&#39;从data_中删除,因此不能是const。