是否需要重复调​​用带有右值引用的移动?

use*_*991 8 c++ move c++11

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));
}
Run Code Online (Sandbox Code Playgroud)

给你调用movemain()调用右值的参考方法,是有必要的线A&B&C重复一个额外的呼叫move()?你已经有rvalue引用了,所以它在vs那些行中做了什么不同吗?

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

注意:最初,我错误地将rvalue引用称为rvalue参数.我很抱歉.我已经纠正了这个问题,以便更容易找到问题并使其更清晰.

Nat*_*ica 12

给你调用movemain()调用右值参数的方法,是有必要的线A&B&C重复一个额外的呼叫move()

是.你称之为rvalue参数实际上是一个右值引用.就像左值引用一样,它是在使用它的范围内的左值.这意味着您需要使用move它将其强制转换为右值,以便它被移动而不是复制.请记住,如果对象具有名称,则它是左值.