是否需要使用右值引用重复调用 move?

Is repeatedly calling move with rvalue references necessary?

struct Bar
{    
   Bar(std::string&& val)
    : m_Val(std::move(val)) {} // A

  Bar& operator=(Bar&& _other) { m_Val = std::move(_other.m_Val); }
  std::string m_Val;
}

struct Foo
{
  void Func1(Bar&& param)
  {
     Func2(std::move(param)) // B
  }

  void Func2(Bar&& param)
  {
     m_Bar = std::move(param); // C
  }

  Bar m_Bar;
};

void main()
{
   Foo f;
   std::string s = "some str";
   Bar b(std::move(s));
   f.Func1(std::move(b));
}

假设您在 main() 中调用 move 来调用右值引用方法,是否有必要在 A & B & C 行中重复对 move() 的额外调用?您已经有了右值引用,那么它在有和没有的那些行中有什么不同吗?

我在 Bar 的 operator= 中理解这是必要的,因为您在技术上移动 m_Val 而不是 _other 本身正确吗?

注意:最初,我错误地将右值引用称为右值参数。我很抱歉。我已经更正了这一点,以使问题更容易找到并更清楚。

Give that you're calling move in main() to invoke the rvalue parameter methods, is it necessary in lines A & B & C to repeat an additional call to move()?

是的。你所说的 rvalue parameter 实际上是一个右值引用。就像左值引用一样,它是其使用范围内的左值。这意味着您需要使用 move 将其转换回右值,以便移动而不是复制。请记住,如果对象有名称,它是一个左值