是否有必要使用右值引用反复调用move?

时间:2019-02-28 15:51:47

标签: c++ c++11 move

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));
}

鉴于您要在move中调用main()来调用右值引用方法,是否有必要在A&B&C行中重复对move()的附加调用?您已经有了右值引用,那么在有无vs的那些行中,它有什么不同之处吗?

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

注意:最初,我错误地将右值引用称为右值参数。我很抱歉。我已对此进行更正,以使问题更易于查找和阐明。

1 个答案:

答案 0 :(得分:12)

  

鉴于您要在move中调用main()来调用rvalue参数方法,是否有必要在A&B&C行中重复对move()的附加调用? / p>

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