我有一个具有对象矢量的类。有问题的对象已经删除了复制构造函数和复制赋值运算符,因此它们有一个移动构造函数和移动赋值运算符,以允许它们与向量一起使用。这个包含对象的类具有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将是很好的附加/提取,因为他们的立场,我想我会看到使用它是否可以。)
答案 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_cast
从const
删除data_
,但这不是最佳解决方案。也可以使用mutable
关键字,但最好的解决方案是将函数声明为非const函数,因为它修改了对象内部状态。
答案 1 :(得分:0)
Constness,我想。 &#39;提取&#39;从data_中删除,因此不能是const。