Title
Constructor shared_ptr::shared_ptr(Y*) should be constrained
Status
c++17
Section
[util.smartptr.shared.const]
Submitter
United States

Created on 2017-02-03.00:00:00 last changed 81 months ago

Messages

Date: 2017-03-03.22:08:49

Proposed resolution:

This wording is relative to N4640.

  1. Modify [util.smartptr.shared.const] as indicated:

    [Drafting note: This also adds a hyphen to "well defined"]

    template<class Y> explicit shared_ptr(Y* p);
    

    -4- Requires: Y shall be a complete type. The expression delete[] p, when T is an array type, or delete p, when T is not an array type, shall be well formed, shall have well -defined behavior, and shall not throw exceptions. When T is U[N], Y(*)[N] shall be convertible to T*; when T is U[], Y(*)[] shall be convertible to T*; otherwise, Y* shall be convertible to T*.

    -5- Effects: […]

    -6- Postconditions: […]

    -7- Throws: […]

    -?- Remarks: When T is an array type, this constructor shall not participate in overload resolution unless the expression delete[] p is well-formed and either T is U[N] and Y(*)[N] is convertible to T*, or T is U[] and Y(*)[] is convertible to T*. When T is not an array type, this constructor shall not participate in overload resolution unless the expression delete p is well-formed and Y* is convertible to T*.

Date: 2017-03-03.22:08:49

[ Kona 2017-02-27 ]

Accepted as Immediate to resolve NB comment.

Date: 2017-02-28.03:05:42

[ Kona 2017-02-27: Jonathan updates wording after LWG review ]

Date: 2017-02-15.00:00:00

[ 2017-02-23, Jonathan provides wording ]

Previous resolution [SUPERSEDED]:

This wording is relative to N4640.

  1. Modify [util.smartptr.shared.const] as indicated:

    [Drafting note: This also adds a hyphen to "well defined"]

    template<class Y> explicit shared_ptr(Y* p);
    

    -4- Requires: Y shall be a complete type. The expression delete[] p, when T is an array type, or delete p, when T is not an array type, shall be well formed, shall have well -defined behavior, and shall not throw exceptions. When T is U[N], Y(*)[N] shall be convertible to T*; when T is U[], Y(*)[] shall be convertible to T*; otherwise, Y* shall be convertible to T*.

    -5- Effects: […]

    -6- Postconditions: […]

    -7- Throws: […]

    -?- Remarks: When T is an array type, this constructor shall not participate in overload resolution unless the expression delete[] p is well-formed and either T is U[N] and Y(*)[N] is convertible to T*, or Y(*)[] is convertible to T*. When T is not an array type, this constructor shall not participate in overload resolution unless the expression delete p is well-formed and Y* is convertible to T*.

Date: 2017-02-03.00:00:00

Addresses US 125

Paragraph 4: This constructor should not participate in overload resolution unless the Requires clause is satisfied. Note that this would therefore apply to some assignment operator and reset overloads, via Effects: equivalent to some code wording.

Proposed change:

Add a Remarks: clause to constrain this constructor not to participate in overload resolution unless the Requires clause is satisfied.

History
Date User Action Args
2017-07-30 20:15:43adminsetstatus: wp -> c++17
2017-03-05 23:46:08adminsetstatus: immediate -> wp
2017-03-03 22:08:49adminsetmessages: + msg9056
2017-03-03 22:08:49adminsetstatus: new -> immediate
2017-02-28 03:05:42adminsetmessages: + msg9009
2017-02-23 21:02:16adminsetmessages: + msg8990
2017-02-23 21:02:16adminsetmessages: + msg8989
2017-02-03 00:00:00admincreate