Boost logo

Boost :

Subject: [boost] [move] unique_ptr converting constructor
From: Peter Dimov (lists_at_[hidden])
Date: 2015-05-03 19:23:17

While looking at

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.

Boost list run by bdawes at, gregod at, cpdaniel at, john at