#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 да. Смотрите Категории значений