c++ - 将对象的值移动到另一个但避免复制
问题描述
有一种情况,当我通过回调从 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 成员变量吗?只是为了确保不复制,因为它会导致巨大的处理成本?
解决方案
就用std::move(resp)
这里吧。你肯定知道这resp
是一个右值引用,因此你总是想移动。
如果Obj
是模板参数,则需要使用std::forward<Obj>(resp)
. 因为在这种情况下Obj&&
将是一个通用引用,它可以是一个右值 或 左值引用,并std::forward
推断是否resp
可以从中移动。
最终执行复制还是移动取决于pvtmemVarTyOfObj 类的赋值运算符。如果它只包含纯数据并且没有分配的资源(例如通过指针),则 move 不能提供任何好处。
推荐阅读
- svg - 如何更改svg中路径的位置?
- python - 如何从 Python 中的多行字符串中提取复合词
- ios - 如何使用 Flutter MethodChannel 从原生 swift 代码调用 dart 代码中的方法?
- python - 我需要通过以下用户消息分配一个变量,我该怎么做?
- javascript - VSCode,用户片段在使用时不显示 $
- r - 根据另一列 R 的条件创建函数
- python - 在 GeoPandas 中,在用户定义的纬度经度框中选择(线串)数据
- azure - 您能否建议如何解决 azure web 应用程序的 URL 重写规则问题?
- windows - 使用 Powershell 创建交互式计划任务
- r - 使用 sep=" \ " 时出现单独的 {tidyr} 错误的问题