I'm trying to make a sample implementation of std::unique_ptr. Here is the code:
include <iostream>
template<typename T>
class UniquePtr
{
public:
  explicit UniquePtr(T * ptr)
    :m_ptr(ptr)
  {};
  UniquePtr(UniquePtr const & other) = delete;
  UniquePtr& operator=(UniquePtr const & other) = delete;
  explicit UniquePtr(UniquePtr && other)
  {
    m_ptr = other.m_ptr;
    other.m_ptr = nullptr;
  }
  UniquePtr & operator=(UniquePtr && other)
  {
    std::cout << "Move assignment called " << std::endl;
    m_ptr = other.m_ptr;
    other.m_ptr = nullptr;
  }
  ~UniquePtr()
  {
    delete m_ptr;
  }
  T& operator*()
  {
    return *m_ptr;
  }
  T& operator->()
  {
    return m_ptr;
  }
private:
  T * m_ptr = nullptr;
};
int main()
{
  UniquePtr<int> t(new int(3));
  t= UniquePtr<int>(new int(4));
  std::cout << *t << std::endl;
}
This code compiles and I'm able to see the value 4 in the output even after deleting the default assignment and copy constructor. What am I doing wrong?
 
     
    