Re: [Boost-bugs] [Boost C++ Libraries] #12019: Conversion from unique_ptr to shared_ptr is too broad

Subject: Re: [Boost-bugs] [Boost C++ Libraries] #12019: Conversion from unique_ptr to shared_ptr is too broad
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2016-02-25 21:27:20


#12019: Conversion from unique_ptr to shared_ptr is too broad
-------------------------------------------+-----------------------
  Reporter: Tavian Barnes <tavianator@…> | Owner: pdimov
      Type: Bugs | Status: new
 Milestone: To Be Determined | Component: smart_ptr
   Version: Boost 1.60.0 | Severity: Problem
Resolution: | Keywords:
-------------------------------------------+-----------------------

Comment (by Tavian Barnes <tavianator@…>):

 Argh, messed up the formatting. Should read like this:

 ---

 The following program doesn't compile because the foo overload is
 ambiguous. This applies if boost::movelib::unique_ptr is used as well. It
 works if std::shared_ptr is used instead of boost::shared_ptr.

 {{{
 $ cat foo.cpp
 #include <boost/shared_ptr.hpp>
 #include <memory>

 using boost::shared_ptr;
 using std::unique_ptr;
 using std::make_unique;

 template <typename T>
 class Provider
 { };

 template <typename T>
 void foo(shared_ptr<T> ptr)
 { }

 template <typename T>
 void foo(unique_ptr<Provider<T>> ptr)
 { }

 class IntProvider : public Provider<int>
 { };

 void bar() {
   foo<int>(make_unique<IntProvider>());
 }
 $ g++ -std=c++14 -c foo.cpp
 foo.cpp: In function ‘void bar()’:
 foo.cpp:24:38: error: call of overloaded
 â€˜foo(std::_MakeUniq<IntProvider>::__single_object)’ is ambiguous
    foo<int>(make_unique<IntProvider>());
                                       ^
 foo.cpp:13:6: note: candidate: void foo(boost::shared_ptr<X>) [with T =
 int]
  void foo(shared_ptr<T> ptr)
       ^
 foo.cpp:17:6: note: candidate: void foo(std::unique_ptr<Provider<T> >)
 [with T = int]
  void foo(unique_ptr<Provider<T>> ptr)
       ^
 }}}

 The boost::shared_ptr<T> constructor taking unique_ptr<Y, D> should be
 SFINAE'd away when unique_ptr<Y, D>::pointer isn't convertible to T*.

 The std::shared_ptr DR is #2399: http://www.open-
 std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2399

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/12019#comment:1>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:19 UTC