std::unique_ptr p1(new int);
std::unique_ptr p2(new int);
p2=p1;
It seems here that p1 is no longer \"unique\" since p2 refer to
std::unique_ptr is non-assignable and non-copyable. You need to use std::move();
so
p1 = std::move(p2);
Have a look here for more info.
Here is an article I wrote which answers your questions. I originally wrote this article to present an emulation of unique_ptr. However you can ignore the first few paragraphs dealing with the emulation and just start reading at "Basic Examples".
http://howardhinnant.github.io/unique_ptr03.html
Edit:
I had trouble distilling the above linked article down to something small enough to make a practical answer in this format. However here is my best shot:
The reason: Safety in generic code. One can not really make copies of either
auto_ptrorunique_ptr. Consider:template <class T> void foo(T t) { T copy_of_t = t; // line 4 assert(copy_of_t == t); }It is not unusual at all for generic code to look like
fooabove. Theassertis probably not actually there, but the assumption that theassertwould hold often is there ... implicitly. Indeed, a popular implementation ofstd::sorthad exactly this logic in 1996, which is exactly what prompted the secondauto_ptrredesign (which helped, but didn't completely fix the problem).
As per this, p2=p1 is a compilation error.