Нужно ли повторно вызывать move со ссылками на rvalue? - PullRequest
0 голосов
/ 28 февраля 2019
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() для вызова эталонных методов rvalue, необходимо ли в строках A & B и C повторить дополнительный вызов move()?У вас уже есть ссылка на rvalue, так что он делает что-то другое в этих строках с vs без?

Я понимаю, что в баре operator= это необходимо, потому что вы технически перемещаете m_Val вместо _otherсамо по себе правильно?

Примечание. Первоначально я неправильно называл ссылки на rvalue параметрами rvalue.Мои извенения.Я исправил это, чтобы облегчить поиск и прояснение вопроса.

1 Ответ

0 голосов
/ 28 февраля 2019

Если вы вызываете move в main(), чтобы вызвать методы параметра rvalue, необходимо ли в строках A & B и C повторить дополнительный вызов move()?

Да.То, что вы называете параметром rvalue , на самом деле является ссылкой на rvalue.Точно так же, как ссылка lvalue, она является lvalue в используемой области.Это означает, что вам нужно использовать move, чтобы привести его обратно в r-значение, чтобы оно перемещалось, а не копировалось.Помните, , если у объекта есть имя, это lvalue .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...