4024. Underspecified destruction of objects created in std::make_shared_for_overwrite/std::allocate_shared_for_overwrite

Section: 20.3.2.2.7 [util.smartptr.shared.create] Status: New Submitter: Jiang An Opened: 2023-12-16 Last modified: 2023-12-16 14:01:33 UTC

Priority: Not Prioritized

View other active issues in [util.smartptr.shared.create].

View all other issues in [util.smartptr.shared.create].

View all issues with New status.

Discussion:

Currently, only destructions of non-array (sub)objects created in std::make_shared and std::allocate_shared are specified in 20.3.2.2.7 [util.smartptr.shared.create]. Presumably, objects created in std::make_shared_for_overwrite and std::allocate_shared_for_overwrite should be destroyed by plain destructor calls.

Proposed resolution:

This wording is relative to N4964.

  1. Modify 20.3.2.2.7 [util.smartptr.shared.create] as indicated:

    template<class T, ...>
      shared_ptr<T> make_shared(args);
    template<class T, class A, ...>
      shared_ptr<T> allocate_shared(const A& a, args);
    template<class T, ...>
      shared_ptr<T> make_shared_for_overwrite(args);
    template<class T, class A, ...>
      shared_ptr<T> allocate_shared_for_overwrite(const A& a, args);
    

    […]

    -7- Remarks:

    1. […]

    2. (7.11) — When a (sub)object of non-array type U that was initialized by make_shared, make_shared_for_overwrite, or allocate_shared_for_overwrite is to be destroyed, it is destroyed via the expression pv->~U() where pv points to that object of type U.

    3. […]