1) Конструктор перемещения по умолчанию не знает о семантике вашего класса.Поэтому он перемещает указатель rhs
, но не сбрасывает другой указатель, который также будет удален в другом деструкторе.
2) *rhs
вызывает operator*
и возвращает временное значение / r.T*
, копия внутреннего указателя, и не соответствует обычному operator*
, который должен возвращать T&
или const T&
.
3) см. 2. вы возвращаете временныйобъект.
Итак, наконец, что вы должны иметь:
unique_ptr(unique_ptr&& rhs) // = default deletes m_ptr twice
: m_ptr(rhs.m_ptr)
{
rhs.m_ptr = nullptr; // *rhs = nullptr doesn't work (*rhs is an rvalue)
}
T& operator*() {return *m_ptr;}
const T& operator*() const {return *m_ptr;}
И так далее.