Подразумевается ли семантика перемещения непосредственно перед уничтожением rvalue?

#c #c 11

#c #c 11

Вопрос:

В следующей функции:

 void SetObject(Object object) 
{
    m_Object = object;
}
  

SetObject Будет получена копия object , которая является значением rvalue , которое присваивается m_Object и немедленно выходит из области видимости.

Будет ли подразумеваться семантика перемещения, чтобы вторая копия object не создавалась без необходимости? Похоже, что семантика перемещения должна подразумеваться, хотя я, вероятно, что-то упускаю. Другими словами, нужно ли мне писать это следующим образом?

 void SetObject(Object object) 
{
    m_Object = std::move(object);
}
  

Комментарии:

1. Вам нужно move() . Даже если компилятор может сделать вывод, что объект выходит из области видимости позже, это не обязательно.

2. Обратите внимание, что «присвоение члену» и «оператор возврата» не имеют одинаковых правил в этом экземпляре…

Ответ №1:

Да, вам нужно std::move избегать копирования.

Ответ №2:

object Параметр SetObject() может быть или не быть инициализирован из rvalue на сайте вызова, но внутри SetObject() него, конечно, не rvalue , это значение lvalue (поскольку у него есть имя).

Как таковой:

 void SetObject(Object object) 
{
    m_Object = object;
}
  

выполнит копирование m_Object , а не перемещение.

Вам необходимо std::move() явно использовать для приведения object к rvalue, чтобы выполнить перемещение m_Object (при Object условии, что поддерживается семантика перемещения, в противном случае будет выполнено копирование):

 void SetObject(Object object) 
{
    m_Object = std::move(object);
}
  

Комментарии:

1. Ах. Очевидно, я не понимаю, что представляет собой значение lvalue. Итак, все, что имеет имя, является значением lvalue ?

2. @buttonsrtoys да. Смотрите Категории значений