std::move, advanced
От: johny5 Новая Зеландия
Дата: 23.11.15 02:28
Оценка: -1
Привет.

В инете валяются примеры swap написанный через std::move:
template<typename T>
void swap(T& x, T& y)
{
  T z = std::move(x);
    x = std::move(y);
    y = std::move(z);
}


Мой вопрос в том, что, к примеру в 1й строке, состояние объекта 'x' вытаскивается и ложится в 'z', оставляя 'x' в некоем состоянии с которым можно только вызвать деструктор, никак более переиспользовать нельзя.

Тут же как видно, объекту можно присвоить и потом объект можно будет использовать по полной, как обычно.

Я вижу в этом противоречие. Кто то на SO пишет, что оказвыается для STL объектов есть дополнительное требование, можно им ещё присваивать после того как с них двинули content. Но это типа только для STL. User defined типы впринципе необязаны оставаться присваемыми. Т.е. этот своп это чистый undefined behaviour.

---

Кроме того, у нас в коде я вижу кучу
some_func( std::move( my_unique_ptr ) ); // отдали владение
...
my_unique_ptr.reset( ... );

С одной стороны отдавать указатель по std::move — есть самое верное для unique_ptr. Но при этом дальнейшее переиспользование этого же указателя является прямым нарушением стандарта.

В общем связка непоняток.

---

Как правильно пользоваться объектом из которого двинули content std::move-ом?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.