【发布时间】:2019-11-08 05:54:03
【问题描述】:
我在看一本关于用C++实现的数据结构的书,我看不懂代码sn-p,它是向量类的一部分
void push_back(object &&x) {
//do something
objects[size++] = std::move(x);
}
我知道std::move返回的是对象的右值引用,但是push_back成员函数已经有了右值引用x作为参数,这里的std::move是不是没必要?
另一个问题是,如果我们有一个类对象的右值引用,如果我们想要调用移动而不是版权,我们仍然需要在其成员上使用std::move?像下面的代码:
A& operator=(A&& other) {
member = std::move(other.member);
return *this;
}
【问题讨论】:
-
OT:那是什么书?
objects[size++] = std::move(x);需要在&objects[size]处具有向量值类型的有效对象,这不是push_back应该如何工作的。向量通常使用placement new(通常是分配器的construct)在此处创建新对象,而不是赋值运算符。另请注意,如果赋值抛出(通过抛出移动赋值操作或复制赋值操作),那么size将递增并且向量的状态将不正确。最好在下一行做size++;。
标签: c++ c++11 move-semantics rvalue-reference value-categories