首页 > 解决方案 > 将对象的值移动到另一个但避免复制

问题描述

有一种情况,当我通过回调从 API 获得回复时,我需要移动对象以回复我的类成员变量以继续处理。以下代码能否实现目标:

class Obj {
public:
 Obj (unit32_t& x, std::string& x, int& data)
{}
... lot of variable .. no pointers
};
class A
{
public:
 A(Obj& r):pvtmemVarTyOfObj(0,"",0) {}
 private:
 Obj pvtmemVarTyOfObj ;
};

void A::GetResponse(Obj&& resp)
{
  //pvtmemVarTyOfObj = std::forward<Obj>(std::move(resp));
   pvtmemVarTyOfObj = std::move(resp);

}

这段代码实际上会移动到 pvtmemVarTyOfObj 成员变量吗?只是为了确保不复制,因为它会导致巨大的处理成本?

标签: c++c++11

解决方案


就用std::move(resp)这里吧。你肯定知道这resp是一个右值引用,因此你总是想移动。

如果Obj是模板参数,则需要使用std::forward<Obj>(resp). 因为在这种情况下Obj&&将是一个通用引用,它可以是一个右值 左值引用,并std::forward推断是否resp可以从中移动。

最终执行复制还是移动取决于pvtmemVarTyOfObj 类的赋值运算符。如果它只包含纯数据并且没有分配的资源(例如通过指针),则 move 不能提供任何好处。


推荐阅读