While looking at https://svn.boost.org/trac/boost/ticket/11259 I found that after implementing a converting shared_ptr constructor that takes a boost::movelib::unique_ptr, the straightforward code in the ticket still fails (with g++ in C++03 mode): namespace mystd { using boost::shared_ptr; using boost::make_shared; using boost::movelib::unique_ptr; using boost::movelib::make_unique; } mystd::unique_ptr<int> load_thing() { return mystd::make_unique<int>(1); } mystd::shared_ptr<int> get_thing() { return load_thing(); } So, out of curiosity, I looked at how unique_ptr itself implements its converting constructor. It turns out that it, too, doesn't work. mystd::unique_ptr<int const> get_thing_2() { return load_thing(); } Furthermore, the two possible ways to make the shared_ptr code work: mystd::shared_ptr<int> get_thing() { mystd::shared_ptr<int> r( load_thing() ); return r; } mystd::shared_ptr<int> get_thing() { mystd::unique_ptr<int> r( load_thing() ); return boost::move( r ); } fail for the unique_ptr<int const> case.