Привет.
В инете валяются примеры 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-ом?