This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of CD1 status.
Section: 20.3.2.2.2 [util.smartptr.shared.const], 20.3.2.3.2 [util.smartptr.weak.const] Status: CD1 Submitter: Peter Dimov Opened: 2007-05-10 Last modified: 2016-01-28
Priority: Not Prioritized
View other active issues in [util.smartptr.shared.const].
View all other issues in [util.smartptr.shared.const].
View all issues with CD1 status.
Discussion:
Since all conversions from shared_ptr<T>
to shared_ptr<U>
have the same
rank regardless of the relationship between T
and U
, reasonable user
code that works with raw pointers fails with shared_ptr
:
void f( shared_ptr<void> ); void f( shared_ptr<int> ); int main() { f( shared_ptr<double>() ); // ambiguous }
Now that we officially have enable_if
, we can constrain the constructor
and the corresponding assignment operator to only participate in the
overload resolution when the pointer types are compatible.
Proposed resolution:
In 20.3.2.2.2 [util.smartptr.shared.const], change:
-14- Requires:
For the second constructorThe second constructor shall not participate in the overload resolution unlessY*
shall beis implicitly convertible toT*
.
In 20.3.2.3.2 [util.smartptr.weak.const], change:
template<class Y> weak_ptr(shared_ptr<Y> const& r);weak_ptr(weak_ptr const& r);template<class Y> weak_ptr(weak_ptr<Y> const& r);weak_ptr(weak_ptr const& r); template<class Y> weak_ptr(weak_ptr<Y> const& r); template<class Y> weak_ptr(shared_ptr<Y> const& r);-4- Requires:
FortThe second and third constructors,shall not participate in the overload resolution unlessY*
shall beis implicitly convertible toT*
.