何时使用std::move是多余的?

3

简单来说,我有一个类,想要移动封装的对象。

std::string m_S;
string_t(string_t&& s)
  : m_S(s.m_S)
{
}

为了完整起见,我省略了周围的类结构,只添加了成员m_S

我是否需要使用std::move包装成员访问,还是直接使用s作为右值引用传递即可?


你需要在这里使用 std::move,因为 s 在此处是一个左值。周围有很多好的重复内容,我会尝试找到一个。 - juanchopanza
2个回答

6

在这里确实需要使用 move。因为 s.m_S 是一个左值表达式,所以无法与一个 _rvalue_ 引用绑定。

即使 s 本身也是一个左值表达式,所以如果您想要使用它来移动构造一个变量,您还需要使用 move


当你思考std::move的实际作用以及什么构成了rvalue(临时值)时,我认为我开始理解了,尽管有时会有一些自动完成的情况,这并不完全容易理解(例如按值返回)。 - John Leidegren

1
如果函数参数类型是右值引用,那么在函数内部该参数仍然是左值(对于构造函数的初始化列表也是如此)。
因此,如果您确实需要,请使用std::move或等效物。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接